如何将一组对象传递给一个接收基础对象集合的方法?

时间:2011-12-23 23:59:33

标签: c#

说我有这个方法

 public void test(IList<AvaliableFeaturesVm> vm)
        {

        }

我有这个继承我的基类

的类
public class TravelFeaturesVm : AvaliableFeaturesVm
    {

    }

如何将其传递给方法“test”。如果测试只接受一个AvaliableFeatureVm对象,它会让我传入一个TravelFeaturesVm对象,但由于它们在一个集合中,它不会让我。

3 个答案:

答案 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 covarianceIEnumerable<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];

因为约束确保从TAvailableFeaturesVm进行适当的转换。

有关通用差异的更多信息,请参阅Eric Lippert's blog posts

答案 2 :(得分:2)

将您的收藏集声明为AvaliableFeaturesVm的集合。这将允许您将TravelFeaturesVm - 对象放入集合中,并允许您将集合传递给您的方法:)