C # Erstellen von Objekten mit Generics zur Laufzeit
Frage
Im folgende Beispiel i dynamisch über einen String ein Objekt erzeugen kann; Allerdings habe ich keine Möglichkeit, an den öffentlichen Methoden der Basisklasse zu erhalten. Ich kann obj nicht auf eine BASE werfen, weil ich weiß nicht, was Generika wird zur Entwurfszeit verwendet werden. wäre schön, alle suggestings auf so zur Laufzeit zu tun.
Projekt A enthält Klasse A {T, J>: BASE {T, J>
Projekt B enthält Klasse B {T, J>: BASE {T, J>
Projekt C enthält Klasse BASE {T, J>
public virtual Kontrolle {T, J> Artikel
Projekt Windows Form
cmdGo_Click Ereignis
string dll = TextBox1.Text // ex "ProjectA.dll"
String class = TextBox2.Text // ex "A`2 [ENUT, enuJ]"
Objekt OBJ = activator.createinstancefrom (dll, Klasse)
Lösung
Laufzeit der Generika-Teil der Gleichung keine Rolle spielt, weil der Compiler bereits in den Lücken für die generische Implementierung gefüllt hat. Ich glaube, Sie Reflexion erhalten an den Basisklassenmethoden, wie in diesem Beispiel unten verwenden können, ich hoffe, das hilft.
MethodInfo[] baseMethods = obj.GetType().BaseType.GetMethods();
object retObj = baseMethods[0].Invoke(obj, new object[] {"paramVal1", 3, "paramVal3"});
Andere Tipps
Dieser Code erstellt eine Instanz von BASE
Type type = typeof(BASE<,>).MakeGenericType(typeof(int), typeof(string));
object instance = Activator.CreateInstance(type);
Wenn Sie nicht wissen, die Typparameter zur Laufzeit verwendet wird, dann können Sie keine Operationen verwenden, die entweder auf dieser Art abhängen, also ... warum nicht eine nicht-generische Basisklasse machen BASE
dass enthält alle Operationen dass hängt nicht von den generischen Parametern, dann können Sie zu diesem Basistyp Tasche obj
und verwenden.