18 Stimmen

Objekt in generische Liste umwandeln

Ich habe 3 generische Typenlisten.

List<Contact> = new List<Contact>();
List<Address> = new List<Address>();
List<Document> = new List<Document>();

Und speichern Sie sie in einer Variablen vom Typ Objekt. Jetzt nedd tun Cast Back to List zu perfom eine foreach, einige wie diese:

List<Contact> = (List<Contact>)obj;

Aber obj Inhalt ändern jedes Mal, und ich habe einige wie diese:

List<???> = (List<???>)obj;

Ich habe eine weitere Variable, die den aktuellen obj-Typ enthält:

Type t = typeof(obj);

Kann ich so etwas tun?

List<t> = (List<t>)obj;

Obs: Ich habe den aktuellen Typ nicht in der Liste, aber ich muss ihn auswerfen, und ich habe jetzt kein anderes Formular:

List<Contact> = new List<Contact>();

44voto

Andrew Marais Punkte 885

Viele Versuche und Irrtümer brachten mir dies auf SL 5, aber es sollte auch auf einem normalen C# funktionieren. Sie müssen auch LINQ zu Ihrer using-Liste für die letzte Hälfte zu arbeiten hinzufügen.

    List<object> myAnythingList = (value as IEnumerable<object>).Cast<object>().ToList()

Viel Spaß!

36voto

Amy B Punkte 104656

Was für ein heikles Problem. Versuchen Sie dies:

List<Contact> c = null;
List<Address> a = null;
List<Document> d = null;

object o = GetObject();

c = o as List<Contact>;
a = o as List<Address>;
d = o as List<Document>;

Zwischen c, a und d gibt es 2 Nullen und 1 Nicht-Null, also 3 Nullen.


Take 2:

object o = GetObject();
IEnumerable e = o as IEnumerable;
IEnumerable<Contact> c = e.OfType<Contact>();
IEnumerable<Address> a = e.OfType<Address>();
IEnumerable<Document> d = e.OfType<Document>();

4voto

ste-fu Punkte 6651

Ich hatte dieses Problem beim Schreiben eines Validierungsattributs, bei dem ich ein Objekt aus der ValidationContext und wusste, dass es eine Liste sein musste, aber nicht, worum es sich handelte. Es warf eine Ausnahme, wenn ich versuchte, es als IEnumerable<object> aber man könnte es auch als IEnumerable die es dann ermöglichte, die .Cast<object>() über linq.

Letztendlich hat das funktioniert:

var enumerable = listObject as IEnumerable;
var list = enumerable.Cast<object>().ToList();

3voto

Vincent65535 Punkte 61

Ich hatte das gleiche Problem und löste es, indem ich mir den Zweck der gegossenen Objekte ansah. Müssen Sie sie wirklich auf die spezifischen (geschlossenen) generischen Typen übertragen? In meinem Fall hatte der (offene) generische Typ eine Schnittstelle, die ich zum Casting verwendete.

var list = obj as IUsefulInterface;

list.MethodThatIAmInterestedIn();

2voto

Dan Tao Punkte 121990

Eine allgemeine Lösung wie diese (Instanziierung eines Typs mit einem generischen Parameter auf der Grundlage einer System.Type Objekt) ist nicht möglich. Wenn Sie es wirklich nur mit diesen drei Typen zu tun haben, dann haben Sie Glück, denn es ist ziemlich einfach:

Type t = typeof(obj);

if (t == typeof(List<Contact>)) {
    var contactList = (List<Contact>)obj;
    // do stuff with contactList

} else if (t == typeof(List<Address>)) {
    var addressList = (List<Address>)obj;
    // do stuff with addressList

} else if (t == typeof(List<Document>)) {
    var documentList = (List<Document>)obj;
    // do stuff with documentList
}

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X