2016-07-12 18 views
1

Nach dem Beispiel unter this post habe ich herausgefunden, wie man dynamisch eine Liste generischer Typen erstellt. Nun, mein Problem ist, dass ich ADD Elemente zur erstellten Liste aus einer Liste unbekannter Quellen hinzufügen möchte - gibt es eine Möglichkeit, dies zu erreichen?C# Generische Liste zur Laufzeit dynamisch erstellen

EDIT ich mit einer Quellenliste starten Business-Objekte enthalten, aber ich brauche unbedingt die richtige Art von meiner Ausgabeliste, weil der Downstream-Bindungen, die sie benötigen.

Mein Nicht-Kompilierung Code lautet wie folgt:

IList<object> sourceList; // some list containing custom objects 
Type t = typeof(IList).MakeGenericType(sourceList[0].GetType()); 
IList res = (IList)Activator.CreateInstance(t); 
foreach (var item in sourceList) { 
    reportDS.Add(item); // obviously does not compile 
} 
+0

was ist, wenn Sie die Gußgegenstandes geschieht Art der Liste – Armand

+2

Was sind 'sourceList' und' reportDS'? Weißt du welchen Typ _it_ zur Kompilierzeit ist? Wenn nicht, warum benutzt du nicht einfach eine 'List '? –

+1

Sie verwenden 'typeof (IList)', wenn Sie eigentlich 'typeof (List <>)' – Sean

Antwort

1

Ich würde empfehlen, Ihren Code in eine generische Klasse oder Funktion zu bewegen, um die Reflexion auf ein höheres Niveau zu bewegen:

private static List<T> CloneListAs<T>(IList<object> source) 
{ 
    // Here we can do anything we want with T 
    // T == source[0].GetType() 
    return source.Cast<T>().ToList(); 
} 

es zu nennen:

IList<object> sourceList; // some list containing custom objects 
// sourceList = ... 

MethodInfo method = typeof(this).GetMethod("CloneListAs"); 
MethodInfo genericMethod = method.MakeGenericMethod(sourceList[0].GetType()); 

var reportDS = genericMethod.Invoke(null, new[] {sourceList}); 
+0

Super! Das funktioniert perfekt, danke! – neggenbe

3

Es dieser Code ein paar Gründe, ist nicht funktioniert.

Zuerst müssen Sie eine Instanz eines konkreten Typs erstellen. Sie nehmen eine nicht generische Schnittstelle (IList) und versuchen, einen generischen Typ daraus zu erstellen. Sie benötigen typeof(List<>).

Zweitens rufen Sie AddItem, die keine Methode auf IList ist. Sie müssen Add aufrufen, weshalb der Code nicht kompiliert wird.

Dieser Code wird das tun, was Sie wollen:

IList<object> sourceList; // some list containing custom objects 
Type t = typeof(List<>).MakeGenericType(sourceList[0].GetType()); 
IList res = (IList)Activator.CreateInstance(t); 

foreach(var item in sourceList) 
{ 
    res.Add(item); 
} 

jedoch die Annahme, dass sourceList[0] hält die richtige Art kommen Sie zu beißen. Wenn diese Liste eine Sequenz von Objekten enthält, die nicht typkompatibel mit dem ersten Element in der Liste sind, schlägt jeder Versuch, zu res hinzuzufügen, fehl. Wie im Kommentar erwähnt, wäre es besser, wenn Sie ein List<object> erstellen, um die Elemente zu halten.