2013-06-20 3 views
2

Tout au long de la réflexion, y a-t-il un moyen d'y parvenir?
obtenir IDictionary<,> de IDictionary<int,int>, par exemple?Trouver le type générique

mon intention est:

typeof(UniqueKeyQuery<,>).IsAssignableFrom(query.GetType()) 

Alors que 'requête' est de type UniqueKeyQuery<Sometype,int>.
Je ne veux pas comparer les noms, car je veux que UniqueKeyQuery soit extensible. (. Par exemple, query)

Répondre

1

Vous pouvez

typeof(UniqueKeyQuery<,>).IsAssignableFrom(query.GetType().GetGenericDefitition()) 

Si cela ne fonctionne pas, vous pouvez utilisez ceci (une méthode d'extension statique qui devrait être dans une classe statique)

public static bool IsOrInheritsGenericDefinition(this Type ThisType, Type GenericDefinition, out Type DefinitionWithTypedParameters) 
    { 
     DefinitionWithTypedParameters = ThisType; 

     while (DefinitionWithTypedParameters != null) 
     { 
      if (DefinitionWithTypedParameters.IsGenericType) 
      { 
       if (DefinitionWithTypedParameters.GetGenericTypeDefinition() == GenericDefinition) 
        return true; 
      } 

      DefinitionWithTypedParameters = DefinitionWithTypedParameters.BaseType; 
     } 

     return false; 
    } 

Appelez cela par :

Type QueryType; 
query.GetType().IsOrInheritsGenericDefinition(typeof(UniqueKeyQuery<,>), out QueryType); 
+0

Je crois que 'IsAssignableFrom' ne fonctionnerait pas, car vous ne pouvez jamais affecter un type générique sans paramètre de type. Peut-être que c'est la raison pour laquelle j'ai fait cette méthode dans mes codes. –

+0

Votre mise en œuvre a fonctionné comme un charme. Merci, j'ai beaucoup réfléchi en cas de validation quand elle hérite de UniqueKeyQuery, et cette nouvelle classe n'est pas générique. –

2

Si vous voulez que le type de générique "ouvert" GetGenericTypeDefinition fonctionnerait:

typeof(UniqueKeyQuery<,>).IsAssignableFrom(
    query.GetType().GetGenericTypeDefinition() 
) 
Questions connexes