声明符合C#接口的类我不拥有

Dov*_*Dov 2 c# interface

假设我正在使用第三方库中的多个类,所有这些类都包含一个int ID {get;}属性.例如:

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

class B {
    ...
    int ID {get;}
    ...
}
Run Code Online (Sandbox Code Playgroud)

ID 我需要在我正在编写的方法中使用的唯一属性,它需要引用A或B.我已经声明了一个接口:

interface IHasID
{
    int ID {get;}
}
Run Code Online (Sandbox Code Playgroud)

但我不能把两种A或B作为IHasID叫我的方法时.

例如,在Swift中,我可以声明一个符合"协议"(Swift的接口版本)的扩展.我没有看到用C#做到这一点的方法.引用共享属性的不相关类的最接近方式是什么?

Jon*_*eet 6

不,目前没办法做到这一点.你可以:

  • 只需使用动态类型并使用ID这种方式,在编译时不进行类型检查
  • 每一个的环绕库班在自己的类是不实现的接口
  • 要求维护者添加一个接口

这是可能的,这个功能将在一段时间内被添加到C#.有关详细信息,请参阅Mads Torgersen 关于形状的问题 - 但我怀疑它还有很长的路要走.


cwh*_*ris 5

您可以使用通用方法以及ID的选择器,而不是包装类.这里的用法很简单,但在某些情况下这种模式很有用.

public void MyMethod<T>(T value, Func<T, int> selectId)
{
    var id = selectId(value);
}
Run Code Online (Sandbox Code Playgroud)

和

MyMethod<A>(a, value => value.ID);
MyMethod<B>(b, value => value.ID);
Run Code Online (Sandbox Code Playgroud)

可以缩短为

MyMethod(a, value => value.ID);
MyMethod(b, value => value.ID);
Run Code Online (Sandbox Code Playgroud)

请注意,即使它们看起来相同,但两个lambda不完全相同.

Func<A, int> VS Func<B, int>