2010-09-24 4 views
9

Bit d'un jeu de réflexion, j'ai une classe génériqueclasse et Type.GetType Générique()

public abstract class MyClass<T> : UserControl 
{ 

} 

et moi avons eu un type comme celui-ci

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

et je veux créer et par exemple de MyClass en utilisant le type ... Mais cela ne fonctionne pas.

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

Des idées?

+0

J'utiliserais un IoC. Le code est-il dans une boucle serrée? – Luke101

+0

Des idées sur la façon de faire cela? – Andy

Répondre

0

Vous créez de nouveaux objets en utilisant la réflexion:

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

Les génériques en réflexion sont un peu plus complexes que cela. Ce que vous cherchez sont les méthodes GetGenericTypeDefinition() et MakeGenericType(). Prenez votre type générique (vous pouvez l'obtenir en appelant GetType() sur une instance ou en utilisant typeof (MyClass<Object>)), et appelez GetGenericTypeDefinition() pour obtenir le type générique ouvert de base (MyClass<T>). Puis, sur ce type, appelez MakeGenericType() et passez-lui un tableau avec un élément; le type que vous voulez utiliser pour fermer le générique. Cela vous obtiendra un type générique fermé avec votre type découvert dynamiquement (MyClass<MyType>), que vous pouvez passer à Activator.CreateInstance().

14

Quelque chose comme ceci:

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); 

Maintenant, vous ne serez pas en mesure d'utiliser que comme MyClass<T> en termes d'appeler des méthodes sur elle, parce que vous ne connaissez pas le T ... mais vous pouvez définir une classe de base ou une interface non générique avec des méthodes dans lesquelles vous n'avez pas besoin de T, et les transtyper. Ou vous pouvez appeler les méthodes par réflexion.

+0

J'allais poster un code similaire, mais je ne sais pas comment vous utiliseriez le résultat. Es-tu contraint à la réflexion? (Ah, vous avez ajouté plus de texte confirmant mes pensées.) –

+0

Vous pouvez certainement utiliser cela comme un MyClass , parce que vous connaissez le T. Regardez le nom du type et vous verrez qu'il s'agit d'un mashup du nom de la classe générique et les types de paramètres. Cependant, je ne pense pas que le typeof (MyClass <>) soit légal; vous devez spécifier une fermeture de type, puis le supprimer en utilisant GetGenericTypeDefinition) – KeithS

+0

@ KeighS, le code de Jon ('typeof (MyClass <>)') fonctionne certainement. Testez-le pour vous-même. –

Questions connexes