2012-01-16 11 views
14

Mam rodzajowego interfejsu takiego:Uzyskaj typ interfejsu ogólnego?

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

Potem dostałem tej klasy, która implementuje mojego interfejsu:

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

I wreszcie dostałam:

var MyType = typeof(MyFont); 

I teraz , chcę uzyskać typ System.Drawing.Font z MyType! Obecnie mam ten kod:

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

Ale nie udało się „wyodrębnić” moim typie tutaj ... Próbowałem kilka rzeczy z GetGenericArguments() i innych rzeczy, ale oni albo don” t skompiluj lub zwróć wartość null/List ... Co muszę zrobić?

EDIT: Oto rozwiązanie, które pasuje do mojego kodu dla tych, którzy będą mieli ten sam problem:

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

Czy widziałeś ten wpis: http://stackoverflow.com/questions/557340/c-sharp-generic-list-t-how-to-get-the-type-t-t –

+0

Tak, i para innych, nie odpowiadają na moje pytanie ... Mam wrażenie, że muszę używać GetInterfaces() i robić inne rzeczy, próbuję tego! –

Odpowiedz

10

Ponieważ klasa MyFont realizuje tylko jeden interfejs, można napisać:

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

Jeśli twoja klasa implementuje kilka interfejsów, możesz wywołać metodę GetInterface() z zniekształconą nazwą interfejsu, którego szukasz:

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

Właśnie tego próbuję, ale implementuję wiele interfejsów, który był tylko fragmentem, który odsłonił mój problem! –

+0

Będę "EDIT" z ostatecznym rozwiązaniem, jestem blisko niego –

+0

Będziesz musiał użyć 'GetInterface()' następnie zobacz moją zaktualizowaną odpowiedź. –

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

Dba o troskę o zmianę nazwy interfejsu. Nie ma literału łańcuchowego, więc zmiana nazwy w Visual Studio powinna zaktualizować wyrażenie wyszukiwania.

Powiązane problemy