2014-01-05 55 views
0

我想創建一個類型獨立的轉換器來計算具有泛型類型的集合中的元素。IValueConverter - 鑄造通用集合

public class CollectionCountConverter : IValueConverter 
{ 
    public object Convert(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture) 
    { 
     return ((SomeCastingType)value).Count; 
    } 

    public object ConvertBack(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture) 
    { 
     throw new NotImplementedException(); // not used for oneway binding 
    } 
} 

這種情況下的值是任何類型的集合。問題是找到正確的鑄造類型並投射對象。我想要的東西就像

Type t = value.GetType(); 
ICollection<t> c = (ICollection<t>) value; 
int count = c.Count(); 

但這不起作用。我也嘗試使用Object作爲泛型類型,但後來我得到一個InvalidCastException。有沒有優雅的方式來做到這一點?

+0

這裏涉及的* actual *類型是什麼?大多數集合也實現了非泛型'ICollection'接口,這使得事情變得更簡單了......你可以用它來代替嗎? –

+0

您也可以使用'IEnumerable '。這是聲明Count()的地方。 –

+0

列表的實際類型是**列表 **,它正在使用ICollection接口強制轉換!對不起,我是新來的C#... – user2476294

回答

0

由於IEnumerable<T>是協變的,您可以使用它。

return ((System.Collections.Generic.IEnumerable<object>)value).Count(); 

MSDN

類型參數

出Ť

的類型的對象來枚舉。

This type parameter covariant。也就是說,您可以使用您指定的類型 或更多派生的任何類型。