2012-01-16 20 views
14

que tiene una interfaz genérica de esta manera:Obtener el tipo de interfaz genérica?

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

Entonces tuve esta clase que implementa la interfaz de mi:

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

Y finalmente consiguió un:

var MyType = typeof(MyFont); 

I, ahora , quiero obtener el tipo System.Drawing.Font de MyType! Por el momento, tengo este código:

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

pero no se las arreglan para "extraer" Mi tipo aquí ... he intentado un par de cosas con GetGenericArguments() y otras cosas pero, o don' t compilar o devolver un valor nulo/Lista ... ¿Qué debo hacer?

EDIT: Aquí está la solución que se ajusta a mi código para los que van a tener el mismo problema:

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

¿Has visto esta publicación: http://stackoverflow.com/questions/557340/c-sharp-generic-list-t-how-to-get-the-type-of-t –

+0

Sí, y un par de otros, no responden a mi pregunta ... Mi sensación es que tengo que usar GetInterfaces() y hacer otras cosas, ¡en realidad lo estoy intentando! –

Respuesta

10

Dado que la clase MyFont sólo se implementa una interfaz, se puede escribir:

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

Si su clase implementa varias interfaces, puede llamar al método GetInterface() con el nombre mutilado de la interfaz que está buscando:

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

Eso es lo que intento, pero implemento múltiples interfaces, ¡eso fue solo un fragmento para exponer mi problema! –

+0

Voy a "EDITAR" con la solución final, estoy cerca de eso –

+0

Tendrás que usar 'GetInterface()' luego, ver mi respuesta actualizada. –

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

Esto lo cuida, le preocupa cambiar el nombre de la interfaz. No hay una cadena literal, por lo que un cambio de nombre en Visual Studio debería actualizar su expresión de búsqueda.

Cuestiones relacionadas