所以我有两个接口:
public interface ISomething
{
public int A();
}
public interface ISomethingElse
{
public int B();
}
一个实现两者的对象:
public class MyObject : ISomething, ISomethingElse
{
}
现在我有了这个正在运行的代码:
...
List<MyObject> objects = myObjectManager.SelectAll(); // now have say 10 MyObject
MyUtilityClass myUtilityClass = new MyUtilityClass();
MyOtherUtilityClass myOtherUtilityClass = new MyOtherUtilityClass();
myUtilityClass.MySpecialMethod(objects); // <- compile failure
myOtherUtilityClass.MySpecialMethod(objects); // <- another failure
...
如果我想在所有这些上调用A或B,我该如何编写这样的代码:
public class MyUtilityClass
{
public void MySpecialMethod(List<ISomething> objects) // <- the problem
{
foreach (ISomething o in objects)
o.A();
}
}
public class MyOtherUtilityClass
{
public void MySpecialMethod(List<ISomethingElse> objects) // <- the problem
{
foreach (ISomethingElse o in objects)
o.B();
}
}
如何在MyUtilityClass.MySpecialMethod()
上干净地致电List<MyObject> objects
?没有所有类型转换是否可能? MyUtilityClass.MySpecialMethod()
的参数似乎是问题(我想将参数定义为实现ISomething的对象列表)。
答案 0 :(得分:5)
您可以使用IEnumerable<>
界面代替List<>
。 IEnumerable<>
是协变的。
答案 1 :(得分:4)
列表不支持协方差。
您可以将其更改为IEnumerable<ISomething>
并传递List<MyObject>
。
答案 2 :(得分:4)
就个人而言,我会使用以下签名,因为IEnumerable<T>
是协变的:
public void MySpecialMethod(this IEnumerable<ISomething> objects) // <- the problem
{
foreach (ISomething o in objects)
o.A();
}
致电:
objects.MySpecialMethod();
答案 3 :(得分:1)
不应该
public void MySpecialMethod(List<MyObject> objects)
{
foreach (ISomethingElse o in objects)
o.B();
}
工作?