2016-12-22 4 views
1

Ich habe eine Liste, der Typ des Objekts wird nur zur Laufzeit durch Reflexion gefunden. Aber wenn ich versuche, die Liste der tatsächlichen Entität zuzuordnen, wird ein Fehler ausgegeben, da "Objekt nicht konvertiert werden kann". Unten ist der Code,Liste <Object> dynamisch in Liste konvertieren <Customer>

var obj = new List<Object>(); 
obj.Add(cust1); 
obj.Add(Cust2); 
Type newType = t.GetProperty("Customer").PropertyType// I will get type from property 
var data= Convert.ChangeType(obj,newType); //This line throws error` 
+1

'Type t = t.GetProperty ("Kunde") PropertyType // Ich werde Typen von property' bekommen - Sie definieren eine Variable und verwenden die Variable gleichzeitig. Das ergibt keinen Sinn. – StriplingWarrior

+0

Warum * genau * brauchst du eine 'Liste '? Aus der Beschreibung klingt es so, als würde man eine 'Liste ' in eine 'Liste ' konvertieren, wobei 'T' zur Laufzeit bestimmt wird, aber dann wird' data' den Typ 'object' haben müssen, weil es irgendeinen enthalten kann 'Liste '. Dies macht Ihren Code noch schwächer typisiert. –

+0

So etwas ?: Liste Kunden = obj.Select (O => (Kunde) O.GetType(). GetProperty ("Kunde"). GetValue (O, null)). ToList(); ' – Fruchtzwerg

Antwort

3

Ihr obj Objekt ist kein Customer, es ist ein List von Customer. So sollten Sie die Art der es auf diese Art und Weise erhalten:

var listType = typeof(List<>).MakeGenericType(t); 

Aber Sie könnten Ihr Objekt auf diese listType nicht konvertieren, werden Sie ein Exception bekommen, dass List nicht IConvertible Schnittstelle nicht implementiert.

Lösung ist: nur neue Liste zu erstellen und alle Daten kopieren.

object data = Activator.CreateInstance(listType); 
foreach (var o in obj) 
{ 
    listType.GetMethod("Add").Invoke(data, new []{o}); 
} 
Verwandte Themen