2011-12-23 54 views
1

说我有这个方法如何将对象的集合传递给接收基础对象集合的方法?

public void test(IList<AvaliableFeaturesVm> vm) 
     { 

     } 

我有这个类,继承我的基类

public class TravelFeaturesVm : AvaliableFeaturesVm 
    { 

    } 

我怎么把它传递到方法“测试”。如果测试只接受一个AvaliableFeatureVm对象,它会让我传入一个TravelFeaturesVm对象,但由于它们在一个集合中,它不会让我。

回答

3

随着C#4,你可以做到这一点如果你改变了第一的签名来电:

public void test(IEnumerable<AvaliableFeaturesVm> vm) 
{ 
} 

这是由于这是在C#中推出4 IEnumerable<T>是在C#4中的协变性Tgeneric covariance,但IList<T>不变,所以它不会原样。如果您不使用C#4,则无论如何这都不起作用。

这是假设您所有的方法需要做的是遍历集合。如果它需要修改集合,那么无论如何传入子类型的列表都是不安全的 - 因为该方法可以尝试添加基类的实例或不同的子类型。

另一种方法是使方法本身一般:

public void test<T>(IList<T> vm) where T : AvaliableFeaturesVm 

当然,这有其自身的局限性 - 特别是,你又不能写:

vm.Add(new AvailableFeaturesVm()); 

......虽然你可以

AvailableFeaturesVm first = vm[0]; 

作为约束确保有从TAvailableFeaturesVm的适当转换。

关于一般方差的更多信息,请参阅Eric Lippert's blog posts

+0

这只适用于接口吗? – 2011-12-24 00:06:12

+0

@TomislavMarkovski:接口和代表。 – 2011-12-24 00:06:50

3

你可以使它通用:

public void test<T>(IList<T> vm) where T : AvaliableFeaturesVm 
{ 

} 
+0

对!这实际上比我的建议更好。 – davogotland 2011-12-24 00:04:26

2

申报您的收藏是AvaliableFeaturesVm的集合。这将允许你把TravelFeaturesVm -objects集合中,它可以让你的收集传递给你的方法:)