2012-01-16 7 views
14

J'ai obtenu une interface générique comme ceci:Obtenir le type d'une interface générique?

public interface IResourceDataType<T> 
{ 
    void SetResourceValue(T resValue); 
} 

Je suis arrivé cette classe qui implémente mon interface:

public class MyFont : IResourceDataType<System.Drawing.Font> 
{ 
    //Ctor + SetResourceValue + ... 
} 

Et finalement je me suis un:

var MyType = typeof(MyFont); 

I, maintenant , vous voulez obtenir le type System.Drawing.Font de MyType! Au moment, je me suis ce code:

if (typeof(IResourceDataType).IsAssignableFrom(MyType)) 
{ 
    //If test is OK 
} 

Mais je ne parviennent pas à « extraire » mon type ici ... J'ai essayé quelques choses avec GetGenericArguments() et d'autres choses, mais soit ils n » t compiler ou renvoyer une valeur nulle/Liste ... Que dois-je faire?

EDIT: Voici la solution qui correspondent à mon code pour ceux qui se le même problème:

if (typeof(IResourceDataType).IsAssignableFrom(MyType)) 
{ 
    foreach (Type type in MyType.GetInterfaces()) 
    { 
     if (type.IsGenericType) 
      Type genericType = type.GetGenericArguments()[0]; 
     } 
    } 
} 
+0

Avez-vous vu ce post: http://stackoverflow.com/questions/557340/c-sharp-generic-list-t-how-to-get-the-type-of-t –

+0

Yep, et un couple d'autres, ils ne répondent pas à ma question ... Mon sentiment est que je dois utiliser GetInterfaces() et faire d'autres choses, je l'essaie en fait! –

Répondre

10

Depuis votre classe MyFont implémente une seule interface, vous pouvez écrire:

Type myType = typeof(MyFont).GetInterfaces()[0].GetGenericArguments()[0]; 

Si votre classe implémente plusieurs interfaces, vous pouvez appeler la méthode GetInterface() avec le nom tronqué de l'interface que vous recherchez:

Type myType = typeof(MyFont).GetInterface("IResourceDataType`1") 
          .GetGenericArguments()[0]; 
+0

C'est ce que j'essaie, mais j'implémente des interfaces multiples, c'était juste un extrait pour exposer mon problème! –

+0

Je vais "EDIT" avec la solution finale, j'en suis proche –

+0

Vous devrez utiliser 'GetInterface()' alors, voir ma réponse mise à jour. –

1
var fontTypeParam = typeof(MyFont).GetInterfaces() 
    .Where(i => i.IsGenericType) 
    .Where(i => i.GetGenericTypeDefinition() == typeof(IResourceDataType<>)) 
    .Select(i => i.GetGenericArguments().First()) 
    .First() 
    ; 

Cela prend soin de vous soucier de renommer l'interface. Il n'y a pas de chaîne de caractères, donc un renommage dans Visual Studio devrait mettre à jour votre expression de recherche.

Questions connexes