代码之家  ›  专栏  ›  技术社区  ›  Dov

声明I类不属于C接口的一致性

  •  2
  • Dov  · 技术社区  · 7 年前

    int ID {get;} 属性。例如:

    class A {
        ...
        int ID {get;}
        ...
    }
    
    class B {
        ...
        int ID {get;}
        ...
    }
    

    ID

    interface IHasID
    {
        int ID {get;}
    }
    

    A B IHasID 调用我的方法时。

    5 回复  |  直到 7 年前
        1
  •  6
  •   Jon Skeet    7 年前

    不,现在没有办法。你可以:

    • ID
    • 将每个库类包装在您自己的类中,

    它是 可能的 此功能将在某个时间添加到C。看玛兹·托格森的 issue about shapes 但我怀疑还有很长的路要走。

        2
  •  5
  •   cwharris    7 年前

    不是包装类,而是 能够 使用一个通用方法和一个ID选择器。这里的用法很简单,但是模式在某些情况下很有用。

    public void MyMethod<T>(T value, Func<T, int> selectId)
    {
        var id = selectId(value);
    }
    

    MyMethod<A>(a, value => value.ID);
    MyMethod<B>(b, value => value.ID);
    

    可以简称为

    MyMethod(a, value => value.ID);
    MyMethod(b, value => value.ID);
    

    请注意,尽管它们看起来相同,但这两个羔羊并不相同。

    Func<A, int> 虚拟 Func<B, int>

        3
  •  1
  •   Sergey Kalinichenko    7 年前

    生成具有以下所有内容的通用包装类:

    • 实现 IHasID 接口,
    • 需要 T Func<T,int> 获取身份证,以及
    • 包装值的getter。

    下面是一个例子:

    class HasId<T> : IHasId {
        private readonly Func<T,int> idGetter;
        public Value {get;}
        public Id => idGetter(Value);
        public HasId(T val, Func<T,int> idGetter) {
            Value = value;
            this.idGetter = idGetter;
        }
    }
    
        4
  •  0
  •   Jonathon Chase    7 年前

    如果您想将适配器编写为解决方案,这是我将类型加入层次结构的典型实现。

    public abstract class HasIDAdapter : IHasID {
        public abstract int ID {get;}
    
        private class AAdapter : HasIDAdapter {
            A _a;
            public AAdapter(A a) {
                _a = a;
            }
    
            public override int ID { get => _a.ID; }
        }
    
        private class BAdapter : HasIDAdapter {
            B _b;
            public BAdapter(B b) {
                _b = b;
            }
    
            public override int ID {get => _b.ID;}
        }
    
        public static implicit operator HasIDAdapter(A a) => new AAdapter(a);
        public static implicit operator HasIDAdapter(B b) => new BAdapter(b);
    }
    

    但是,这种情况会推动问题的发生,您仍然需要从 A B HasIDAdapter 在你可以使用接口之前,但这可以通过 B IHasID 方法。

        5
  •  0
  •   npclaudiu    7 年前

    static int IdOf<T>(T t)
    {
        return (int)typeof(T).GetProperty("ID").GetValue(t);
    }