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

실제 목록 유형은 ** List **이며 ICollection 인터페이스 캐스팅과 함께 작동합니다! 죄송합니다, C#에 익숙하지 않습니다 ... – user2476294

답변

0

IEnumerable<T>은 공변 (covariant)이므로이 값을 사용할 수 있습니다.

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

:

유형 T

객체의 유형이 열거에서

매개 변수.

유형 매개 변수는 covariant입니다. 즉, 지정한 유형 또는 더 파생 된 유형을 사용할 수 있습니다.