2009-09-23 7 views
4

Je ne trouve pas un moyen d'utiliser un objet Type de première classe (instance System.Type) en tant que paramètre de type dans une construction générique en C# 3.0/.NET 3.5. Ci-dessous un exemple simplifié de ce que je veux faire:Utilisation d'objets Type en tant que paramètres de type pour génériques en C#

public void test() 
{ 
    Type someType = getSomeType(); // get some System.Type object 

    MyGeneric<someType> obj = new MyGeneric<someType>(); // won't compile 
} 

Est-il possible d'utiliser le UnType objet comme un paramètre de type pour un générique?

+0

J'ai personnellement utilisé un commutateur. Cela peut ne pas être applicable partout ... J'aimerais que ce soit comme dans votre exemple. –

Répondre

17

Vous pouvez créer dynamiquement une instance du type:

public void test() 
{ 
    Type someType = getSomeType(); // get some System.Type object 
    Type openType = typeof(MyGeneric<>); 
    Type actualType = openType.MakeGenericType(new Type[] { someType }); 
    object obj = Activator.CreateInstance(actualType); 
} 

Cependant, vous ne pouvez pas déclarer une variable de ce type, puisque vous ne savez pas statiquement le type réel.

+0

Si quelqu'un vient après ce post, en C# 4.0 [le mot-clé dynamique] (http://msdn.microsoft.com/en-us/library/dd264741.aspx) vous permet de déclarer des variables pour lesquelles la vérification de type à la compilation est désactivé –

+0

@JacobBundgaard, oui, mais ce n'est pas lié au problème de l'OP. Il ne vous permet pas de créer des instances de types génériques lorsque vous ne connaissez pas le paramètre de type lors de la compilation. –

+0

Je ne pense pas que ce soit. Une déclaration dynamique vous permettra d'appeler les méthodes de l'objet MyGeneric créé par réflexion, alors qu'une déclaration d'objet ne le fera pas. Considérez que MyGeneric a une méthode MyMethod. Alors cette coupure de code ne fonctionnera pas: 'object obj = Activator.CreateInstance (actualType); obj.MyMethod(); ', alors que cela sera:' dynamic obj = Activator.CreateInstance (actualType); obj.MyMethod(); ' –

9

Vous essayez de déterminer votre argument de type lors de l'exécution. Les génériques .Net requièrent que les arguments de type soient connus au moment de la compilation. Il n'y a vraiment aucun moyen de le faire en dehors de la commutation sur le type. Vous pourrez peut-être maîtriser la méthode par réflexion et l'invoquer, mais c'est moche.

+3

+1 Thomas montre comment le faire mais vous expliquez mieux pourquoi la réflexion est requise. –

Questions connexes