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>();

1voto

Vadim Punkte 264

Ich lief in das gleiche Problem - ich habe eine Sammlung, die Datentyp nur zur Laufzeit bekannt ist, und ich kann nicht es auf etwas werfen. Keine der obigen Lösungen hat funktioniert. Schließlich löste ich es durch Serialisierung zu JSON und de-serializing zurück. Natürlich ist das nicht ideal, aber vielleicht hilft es jemandem.

string jsonString = JsonConvert.SerializeObject(myObject);
jsonString = "{ values:" + jsonString + "}";

JObject j = JObject.Parse(jsonString);

//now we can iterate over the list
foreach (var x in j["values"])
{
    string name = x.ToString();
    ...
}

0voto

Femaref Punkte 59547

Nein, man kann nicht casten, ohne um die Ecke zu gehen (das heißt: Reflexion), generische Typparameter müssen zur Kompilierzeit bekannt sein. Sie können natürlich etwas wie dies tun:

content.Where(o => o is type).ToList().Foreach(stuff);

-1voto

dominic Punkte 1

Das müssen Sie vielleicht tun:

if(object is List)
{
    list = (List)object
}

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