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)

¿Fue útil?

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.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top