2014-01-05 4 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

Что такое * актуальный * тип здесь? Большинство коллекций также реализуют неорганический интерфейс ICollection, что упрощает ... вы могли бы использовать это вместо этого? –

+0

Вы также можете использовать 'IEnumerable '. Здесь объявляется 'Count()'. –

+0

Фактический Тип списка: ** Список ** и он работает с литьем интерфейса ICollection! Извините, я новичок в C# ... – user2476294

ответ

0

С IEnumerable<T> является ковариантным, вы можете использовать это.

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

От MSDN:

Параметры типа

из Т

Тип объектов для перечисления.

Этот параметр является ковариантным. То есть вы можете использовать либо тип , который вы указали, либо любой тип, который является более производным.