Wie erstellen Sie eine Liste mit<T> Beispiel in C# - Datei mit der Spiegelung
HALLO,
Ich habe eine Anforderung zu erstellen Beispiel für list-Objekt zur Laufzeit mit reflection. Ich habe zum Beispiel 2-Klassen wie unten
class Class1
{
List<Class2> class2List;
public List<Class2> Class2List
{
get;set;
}
}
class Class2
{
public string mem1;
public string mem2;
}
Nach dem erstellen der Instanz von Class1
zur Laufzeit in eine andere Klasse Class3
will ich weisen Sie Werte für alle Eigenschaften der Klasse. In diesem Fall Class2List
ist eine Eigenschaft von List<Class2>
. Zur Laufzeit, ich weiß nicht, die Klasse Typ List<Class2>
. Wie kann ich die initialisieren Sie die Eigenschaft d.h. List<Class2>
innen class3 zur Laufzeit.
Anregungen sind wir sehr dankbar...
Du musst angemeldet sein, um einen Kommentar abzugeben.
Eher als Frage, Ihre Motive oder versuchen otparywajut, was Sie tun - ich bin nur gehen, um eine Antwort auf die Frage im Titel.
Gegeben, Sie haben eine Art Instanz
listElemType
repräsentiert den Typ der Argumente, die übergeben werden, um dieList<>
Typ zur Laufzeit:- Und dann arbeiten Sie mit der Liste durch, es ist
IList
interface-Implementierung.Oder, in der Tat, Sie können aufhören auf die
MakeGenericType
aufrufen und verwenden den Typ, den es erzeugt in einem AufrufActivator.CreateInstance
- wie in Daniel Hilgarth Antwort.Dann gegeben
target
- Objekt, dessen Eigenschaft Sie festlegen möchten:Wenn Sie nicht wissen, die Eigenschaften des Typs vertreten durch
target
, dann müssen Siealle zu erhalten, die öffentlichen Eigenschaften der Instanz. Allerdings nur die Möglichkeit zum erstellen einer list-Instanz ist nicht wirklich in der Lage sein, um Ihnen zu helfen gibt - Sie haben, um eine allgemeinere Lösung, die umgehen kann mit jedem Typ. Es sei denn, Sie werden speziell welche Liste Arten.
Klingt für mich so, müssen Sie möglicherweise eine gemeinsame Schnittstelle oder base...
Type.EmptyTypes
für GetConstructor, und passnull
Aufrufen. Auch Sie haben das wirken des zurückgegebenen Objekts durch Aufrufen:var listInstance = (IList)(typeof(List<>) .MakeGenericType(listElemType) .GetConstructor(new Type[0]) .Invoke(new object[0]));
Type.EmptyTypes
und dienull
zuInvoke
aber ich war gerade schlug es sehr schnell... Die fehlende Besetzung, jedoch, war, weil ich dachte über das hinzufügen, die die IList-bit-nachdem ich wrriten den code! Wird update.Warum brauchen Sie, um reflektion verwenden, um die Eigenschaft?
Nach der Erstellung der Instanz von
Class1
können Sie die Eigenschaft einfach:Hier ein Beispiel (ohne eine angemessene Fehlerbehandlung!) das initialisiert die List-Eigenschaft von Class1.
Was willst du füllen/initialisieren ein Objekt/Feld des Objekts, wenn Sie eine Schnittstelle?
Was wollen Sie füllen, für andere Objekt-Typen (vielleicht mit mehr als 1 parameter des Konstruktors)?
Vielleicht ein inversion of control container dienen würde, die Sie in Ihre Lösung
(wie z.B. Ninject http://ninject.org/, Spring.Net http://www.springframework.net/, Einheit http://unity.codeplex.com/) oder die Elemente werden bereits korrekt initialisiert die Objekte, die Sie verwenden.