2010-09-24 21 views
9

Poco de un puzzle, que tienen una clase genéricagenérico Clase y Type.GetType()

public abstract class MyClass<T> : UserControl 
{ 

} 

y yo tenemos un tipo como éste

Type type = Type.GetType("Type From DB as String", true, true); 

y que quieren crear y la instancia de MyClass usando el tipo ... Pero esto no funciona.

MyClass<type> control = (MyClass<type>)LoadControl("/UsercControl.ascx"); 

Any ideas ????

+0

Yo usaría un IoC. ¿Está el código en un círculo cerrado? – Luke101

+0

¿Alguna idea sobre cómo hacer esto? – Andy

Respuesta

0

Se crea nuevos objetos utilizando la reflexión:

type.GetConstructor(new Type[]{}).Invoke(new object[]{}); 
1

Los genéricos en la reflexión son un poco más complejos que esto. Lo que está buscando son los métodos GetGenericTypeDefinition() y MakeGenericType(). Tome su tipo genérico (puede obtenerlo llamando a GetType() en una instancia, o usando typeof (MyClass<Object>)) y llamando a GetGenericTypeDefinition() para obtener el tipo genérico básico abierto (MyClass<T>). Luego, en ese tipo, llame a MakeGenericType() y páselo una matriz con un elemento; el tipo que desea usar para cerrar el genérico. Eso le proporcionará un tipo genérico cerrado con su tipo descubierto dinámicamente (MyClass<MyType>), que puede pasar a Activator.CreateInstance().

14

Algo como esto:

Type typeArgument = Type.GetType("Type From DB as String", true, true); 
Type template = typeof(MyClass<>); 
Type genericType = template.MakeGenericType(typeArgument); 
object instance = Activator.CreateInstance(genericType); 

Ahora usted no será capaz de uso que como MyClass<T> en términos de llamar a los métodos en él, porque no se conoce el T ... pero podría definir una clase o interfaz base no genérica con algunos métodos en los que no requiere T, y convertirla en eso. O puede llamar a los métodos a través de la reflexión.

+0

Iba a publicar un código similar, pero no estoy seguro de cómo usaría el resultado. ¿Estás obligado a la reflexión? (Ah, usted agregó más texto confirmando mis pensamientos.) –

+0

Puede usarlo como MyClass , porque SI conoce el T. Mire el nombre del tipo y verá que es una mezcla del nombre de clase genérico y los tipos de parámetros. Sin embargo, no creo que el tipo de (MyClass <>) sea legal; tiene que especificar un cierre de tipo, luego quitarlo usando GetGenericTypeDefinition) – KeithS

+0

@KeighS, el código de Jon ('typeof (MyClass <>)' ciertamente funciona. Pruébalo por ti mismo. –

Cuestiones relacionadas