说我有这个方法
public void test(IList<AvaliableFeaturesVm> vm)
{
}
我有这个继承我的基类
的类public class TravelFeaturesVm : AvaliableFeaturesVm
{
}
如何将其传递给方法“test”。如果测试只接受一个AvaliableFeatureVm对象,它会让我传入一个TravelFeaturesVm对象,但由于它们在一个集合中,它不会让我。
答案 0 :(得分:3)
你可以把它变成通用的:
public void test<T>(IList<T> vm) where T : AvaliableFeaturesVm
{
}
答案 1 :(得分:3)
从C#4开始,您可以执行此操作如果您将第一次通话的签名更改为:
public void test(IEnumerable<AvaliableFeaturesVm> vm)
{
}
这是由于C#4中引入了generic covariance。IEnumerable<T>
在C#4的T
中是协变的,但IList<T>
是不变的,所以它不会原样。如果您没有使用C#4,那么无论如何都无法使用。
这假设您需要做的所有方法都是迭代集合。如果它需要修改集合,那么无论如何传入子类型列表都是不安全的 - 因为该方法可能会尝试添加基类的实例,或者不同的亚型。
另一种选择是使方法本身通用:
public void test<T>(IList<T> vm) where T : AvaliableFeaturesVm
当然,这有其自身的局限性 - 特别是,你将无法写下:
vm.Add(new AvailableFeaturesVm());
...虽然你可以做:
AvailableFeaturesVm first = vm[0];
因为约束确保从T
到AvailableFeaturesVm
进行适当的转换。
有关通用差异的更多信息,请参阅Eric Lippert's blog posts。
答案 2 :(得分:2)
将您的收藏集声明为AvaliableFeaturesVm
的集合。这将允许您将TravelFeaturesVm
- 对象放入集合中,并允许您将集合传递给您的方法:)