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)

War es hilfreich?

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.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top