C # Crear objetos con los genéricos en tiempo de ejecución
Pregunta
En el siguiente ejemplo i puede crear un objeto de forma dinámica a través de una cadena; Sin embargo, no tengo forma de llegar a los métodos públicos de la clase base. i no puede emitir obj a una base, porque no sé lo genérico se utiliza en tiempo de diseño. cualquier suggestings sobre cómo hacer esto en tiempo de ejecución sería agradable.
A contiene Proyecto de Clase A {T, J>: BASE {T, J>
Proyecto B contiene Clase B {T, J>: BASE {T, J>
Proyecto C contiene clase base {T, J>
control virtual pública {T, J> elemento
Proyecto de Windows Forms
evento cmdGo_Click
cadena DLL = TextBox1.Text // ex
"ProjectA.dll"
clase string = textbox2.text // ex "A`2 [ENUT, enuJ]"
objeto obj = activator.createinstancefrom (DLL, clase)
Solución
En tiempo de ejecución la parte genéricos de la ecuación no tiene importancia, ya que el compilador ya se ha llenado los huecos para la implementación genérica. Creo que se puede utilizar la reflexión para llegar a los métodos de la clase base, como en este ejemplo de abajo, espero que esto ayude.
MethodInfo[] baseMethods = obj.GetType().BaseType.GetMethods();
object retObj = baseMethods[0].Invoke(obj, new object[] {"paramVal1", 3, "paramVal3"});
Otros consejos
Este código crea una instancia de la base
Type type = typeof(BASE<,>).MakeGenericType(typeof(int), typeof(string));
object instance = Activator.CreateInstance(type);
Si no conoce los parámetros de tipo usado en tiempo de ejecución, entonces no se puede utilizar cualquier operación que dependen de estos tipos, ya sea, así que ... ¿por qué no hacer una clase base no genérica a BASE
que contiene todas las operaciones que no dependen de los parámetros genéricos, a continuación, puede mayúsculas obj
a ese tipo de base y utilizarlo.