Laden...

Generisch Liste anhand einer Type-Variable erstellen

Erstellt von yngwie vor 13 Jahren Letzter Beitrag vor 13 Jahren 834 Views
Y
yngwie Themenstarter:in
238 Beiträge seit 2005
vor 13 Jahren
Generisch Liste anhand einer Type-Variable erstellen

Hallo Community,

ich habe eine Variable 't' vom Type 'System.Type' und möchte zur Laufzeit eine entsprechende generische Liste erstellen. Nur wie mache ich das eigentlich - new List<t.GetType()> geht ja nicht... Vorschläge?

Gruß

6.911 Beiträge seit 2009
vor 13 Jahren

Hallo,

guck mal das Beispiel an:


// Basistyp erstellen:
Type baseType = typeof(List<>);

// Typargumente erstellen:
Type[] typeArgs = { typeof(string) };

// Generischen Typ erstellen:
Type genericType = baseType.MakeGenericType(typeArgs);

// Objekt erstellen:
object o = Activator.CreateInstance(genericType);

List<string> list = o as List<string>;

Console.WriteLine(list == null ? "Fehler" : "Erfolg");

mfG Gü

Stellt fachliche Fragen bitte im Forum, damit von den Antworten alle profitieren. Daher beantworte ich solche Fragen nicht per PM.

"Alle sagten, das geht nicht! Dann kam einer, der wusste das nicht - und hat's gemacht!"

1.130 Beiträge seit 2007
vor 13 Jahren

Ich würde es wie folgt machen, hat den vorteil, dass man aucgh gleich damit arbeiten kann (nichtnur als objekt).

object myMethod<T>()
{
    List<T> list=new List<T>();
    dosomthing(list);
    return list;
}

....
//code zum Aufrufen sieht so aus:
//methode finden
MethodInfo myMethodInfo=typeof(AktuelleKlasse).GetMethod("myMethod",BindingFlags.Instance|BindingFlags.NonPublic);
//generisch machen
myMethodInfo=myMethodInfo.MakeGenericMethod(new Type[1]{t});
//delegate erstellen (man könnte MethodInfo.Invoke benutzen, das ist aber saulahm und lässt sich schlecht debuggen)
Func<object> myMethodDelegate=Delegate.CreateDelegate(typeof(Func<object>),this,myMethodInfo);
//aufrufen
object liste=myMethodDelegate();

Projekte:Jade, HttpSaver
Zum Rechtschreiben gibts doch schon die Politiker. Aber die bauen auch nur mist!

Y
yngwie Themenstarter:in
238 Beiträge seit 2005
vor 13 Jahren

@gfoidl,

Danke, funktioniert prima!

@Floste

hatte vergessen zu erwähnen dass ich mitm .NET Framework 2.0 arbeite 😦 Trotzdem vielen Dank

1.130 Beiträge seit 2007
vor 13 Jahren

das geht soweit ich weiß auch mit .net 2.0
Einfach einen eigenen delegaten definieren:


delegate T Func<T>();

Projekte:Jade, HttpSaver
Zum Rechtschreiben gibts doch schon die Politiker. Aber die bauen auch nur mist!