2011-12-23 58 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集合中,它可以讓你的收集傳遞給你的方法:)