2008-10-28 7 views
1

J'ai les classes suivantesObtenez le type de paramètre générique

public interface InterfaceBase 
{ 
} 

public class ImplementA:InterfaceBase 
{ 
} 

public class ImplementB:InterfaceBase 
{ 
} 

public void TestImplementType<T>(T obj) where T: InterfaceBase 
{ 
} 

Comment déduire ce que le T est de savoir si ou Implementa ImplementB? J'ai essayé d'utiliser

typeof(T) is ImplementA 

mais cette expression est toujours évaluée à false. Edit: Et comment vais-je lancer Obj dans ImplémentA ou ImplémentB?

Répondre

4

obj is ImplementA

+2

Encore une fois, cela ne dit pas que T dérive de Implementa - il ne parle ab sur la valeur particulière de obj. TestImplementType (new ImplémentA()) passera quand (selon la question réelle) il ne devrait pas. –

0

Que diriez-vous:

if(obj.GetType().Equals(typeof(ImplementA))) 
{ 
    // ... 
} 
+0

Ce n'est pas la même chose. Par exemple, vous pouvez appeler: TetstImplementType (new ImplémentA()) –

+0

En fait, le compilateur ne vous laissera pas instancier TestImplementType . Le type System.Object n'implémente pas InterfaceBase. –

+0

Oups, n'avait pas vu la contrainte. Cependant, le point racine est sound - typeof (T) n'est pas la même chose que obj.GetType(). Vous pouvez certainement écrire TestImplementType (new ImplementA()). De plus, cet exemple ne gère pas les classes dérivées de ImplementA. –

4

typeof(T) renvoie le Type de T - et System.Type ne met pas en œuvre ImplementA. Ce que vous voulez est:

if (typeof(ImplementA).IsAssignableFrom(typeof(T)) 
{ 
} 
9

strictement, vous devriez éviter trop de spécialisation dans les génériques. Il serait plus propre de mettre n'importe quelle logique spécialisée dans un membre sur l'interface, de sorte que n'importe quelle implémentation puisse le faire différemment. Cependant, il y a plusieurs façons:

Vous pouvez tester "obj" (en supposant qu'il est non nul)

bool testObj = obj is ImplementA; 

Vous pouvez tester T pour être typeof (Implementa):

bool testEq = typeof(T) == typeof(ImplementA); 

de même, vous pouvez le tester pour être Implementa ou une sous-classe:

bool testAssign = typeof(ImplementA).IsAssignableFrom(typeof(T)); 
Questions connexes