2012-01-16 14 views
14

Ho ottenuto un'interfaccia generica come questa:Ottieni il tipo di un'interfaccia generica?

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

Poi ho avuto questa classe che implementa la mia interfaccia:

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

E finalmente ho ottenuto un:

var MyType = typeof(MyFont); 

I, ora , vuoi ottenere il tipo System.Drawing.Font da MyType! Al momento, ho ottenuto questo codice:

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

Ma non riesco a "estrarre" il mio tipo qui ... ho provato un paio di cose con GetGenericArguments() e altre cose ma o don' t compilare o restituire un valore null/Elenco ... Cosa devo fare?

EDIT: Ecco la soluzione che si adattano il mio codice per coloro che avranno lo stesso problema:

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

Hai visto questo post: http://stackoverflow.com/questions/557340/c-sharp-generic-list-t-how-to-get-the-type-of-t –

+0

Sì, e una coppia di un altro, non rispondono alla mia domanda ... La mia sensazione è che devo usare GetInterfaces() e fare alcune altre cose, in realtà sto provandolo! –

risposta

10

Dal momento che la classe MyFont implementa una sola interfaccia, è possibile scrivere:

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

Se la tua classe implementa diverse interfacce, puoi chiamare il metodo GetInterface() con il nome storpiato dell'interfaccia che stai cercando:

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

Questo è quello che sto provando, ma implemento le multi-interfacce, che era solo un frammento per esporre il mio problema! –

+0

I "EDIT" con la soluzione finale, sono vicino ad esso –

+0

Dovrai usare 'GetInterface()' poi, vedi la mia risposta aggiornata. –

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

Questo si prende cura di voi riguardo alla ridenominazione dell'interfaccia. Non esiste una stringa letterale, quindi una modifica in Visual Studio dovrebbe aggiornare la tua espressione di ricerca.

Problemi correlati