C # creare oggetti con i generici in fase di esecuzione
Domanda
Nel seguente esempio posso creare un oggetto dinamicamente tramite una stringa; tuttavia, non ho modo di ottenere i metodi pubblici della classe base. non posso lanciare obj ad una base, perché io non so cosa generico verrà utilizzato in fase di progettazione. eventuali suggestings in tal modo in fase di esecuzione sarebbe bello.
Progetto A contiene Classe A {T, J>: BASE {T, J>
Progetto B contiene Classe B {T, J>: BASE {T, J>
Progetto C contiene classe base {T, J>
controllo virtuale pubblica {T, J> oggetto
progetto Windows Form
evento cmdGo_Click
stringa dll = TextBox1.Text // ex
"ProjectA.dll"
classe string = textbox2.text // ex "A`2 [enuT, enuJ]"
object obj = activator.createinstancefrom (dll, classe)
Soluzione
Al runtime la parte generici dell'equazione non importa, perché il compilatore ha già riempito le lacune per l'implementazione generica. Io credo che si possa utilizzare la reflection per ottenere i metodi della classe base, come in questo esempio qui di seguito, spero che questo aiuta.
MethodInfo[] baseMethods = obj.GetType().BaseType.GetMethods();
object retObj = baseMethods[0].Invoke(obj, new object[] {"paramVal1", 3, "paramVal3"});
Altri suggerimenti
Questo codice crea un'istanza di BASE
Type type = typeof(BASE<,>).MakeGenericType(typeof(int), typeof(string));
object instance = Activator.CreateInstance(type);
Se non si conoscono i parametri di tipo utilizzato in fase di esecuzione, quindi non è possibile utilizzare tutte le operazioni che dipendono da questi tipi di entrambi, quindi ... perché non fare una classe base non generico a BASE
che contiene tutte le operazioni che non dipendono dai parametri generici, allora si può tra maiuscole obj
a quel tipo di base e utilizzarlo.