2017-06-14 3 views
2

Wie kann man etwas ähnliches wie listOfBaseItems.Cast<Child>() mit einem in Runtime definierten Typ erreichen? z.B.Cast IEnumerable <T> auf Laufzeittyp

var t = typeof(Child); // the type would be a method argument in my case 
var desiredType = typeof(List<>).MakeGenericType(t); 
var castedList = Convert.ChangeType(listOfBaseItems, desiredType); 

erhalte ich eine Ausnahme, dass die Elemente nicht IConvertible nicht implementiert. Was vermisse ich?

+0

'Cast' ist nur eine generische Erweiterungsmethode, Sie können Reflektion verwenden, um sie aufzurufen. –

+0

Sie versuchen, eine 'Liste ' in eine 'Liste ' zu schreiben, die * nicht * funktionieren kann. 'Liste ' ist eine Klasse und daher invariant. Sie müssen besser erklären, was Sie hier erreichen wollen. Siehe [ask] –

+0

Anstatt den Typ als Argument zu übergeben, verwendet eine generische Methode eine Option 'public void Bob ()'? Oder ist der Typ nur zur Laufzeit bekannt, nicht Kompilierzeit? – mjwills

Antwort

1

Unter der Annahme, dass die Besetzung legal ist (zB listOfBaseItems enthält tatsächlich untergeordneten Elemente), dann können Sie Cast aufrufen (die eine generische Erweiterungsmethode in der Enumerable Klasse) zur Laufzeit wie folgt aus:

var result = 
    typeof(Enumerable) 
     .GetMethod("Cast") 
     .MakeGenericMethod(t) 
     .Invoke(null, new object[] {listOfBaseItems}); 
+0

Danke, das ist, was ich brauchte! – filur

+0

Gern geschehen. –

Verwandte Themen