2009-09-10 6 views
10

Próbowałem zrobić to na dobre kilka godzin teraz i to o ile mamJak mogę wykonać Lista <object> .Cast <T> użyciu odbicia, gdy T jest nieznany

var castItems = typeof(Enumerable).GetMethod("Cast") 
        .MakeGenericMethod(new Type[] { targetType }) 
        .Invoke(null, new object[] { items }); 

ten zwraca mi

System.Linq.Enumerable + d__aa`1 [MyObjectType]

natomiast muszę (dla mojego ViewData) jako rodzajowy listy np:

System.Collections.Generic.List`1 [MyObjectType]

Wszelkie wskaźniki byłyby wielką

Odpowiedz

17

Wystarczy zadzwonić ToList() na nim potem:

static readonly MethodInfo CastMethod = typeof(Enumerable).GetMethod("Cast"); 
static readonly MethodInfo ToListMethod = typeof(Enumerable).GetMethod("ToList"); 

... 

var castItems = CastMethod.MakeGenericMethod(new Type[] { targetType }) 
          .Invoke(null, new object[] { items }); 
var list = ToListMethod.MakeGenericMethod(new Type[] { targetType }) 
          .Invoke(null, new object[] { castItems }); 

Inną opcją byłoby napisanie pojedynczej ogólnej metody w swojej klasie, aby to zrobić, i zadzwoń pod numer , który z refleksją:

private static List<T> CastAndList(IEnumerable items) 
{ 
    return items.Cast<T>().ToList(); 
} 

private static readonly MethodInfo CastAndListMethod = 
    typeof(YourType).GetMethod("CastAndList", 
           BindingFlags.Static | BindingFlags.NonPublic); 

public static object CastAndList(object items, Type targetType) 
{ 
    return CastAndListMethod.MakeGenericMethod(new[] { targetType }) 
          .Invoke(null, new[] { items }); 
} 
+0

Dzięki całkowicie zapomniałem (dzięki ślepocie na kod) dzięki. [btw, aby być kompletnym, jest literówka w twojej metodzie dla każdego, kto może chcieć skopiować jakikolwiek wklej powinien powiedzieć var ​​list = ToListMethod.MakeGen .....] –

+0

Naprawiłem literówkę. –

+0

Brilliant. Trudno znaleźć, ale całkowicie rozwiązałem mój problem. Dziękuje wszystkim. –

Powiązane problemy