2012-01-16 68 views
14

我有一個通用的接口是這樣的:獲取通用接口的類型?

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

然後我得到了這個類,它實現我的接口:

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

最後我得到了一個:

var MyType = typeof(MyFont); 

我,現在,想要從MyType獲得System.Drawing.Font類型! 目前,我得到這個代碼:

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

但我不設法在這裏「抽取」我喜歡的類型...... 我試了幾件事情與GetGenericArguments()和其他的東西,但他們要麼不要」 t編譯或返回空值/列表... 我該怎麼做?

編輯: 這裏是適合我的代碼對於那些誰就會得到同樣的問題的解決方案:

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

你見過這個帖子:http://stackoverflow.com/questions/557340/c-sharp-generic-list-t-how-to-get-the-type-of-t – 2012-01-16 14:30:46

+0

是的,和一對夫婦他們不回答我的問題......我的感覺是,我必須使用GetInterfaces()並做一些其他的事情,我實際上正在嘗試它! – 2012-01-16 14:32:15

回答

10

由於您MyFont類只實現一個接口,你可以寫:

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

如果您的班級實施了多個界面,您可以使用您正在查找的界面的錯亂名稱調用GetInterface()方法:

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

這就是我正在嘗試的,但我確實實現了多接口,這只是一個暴露我的問題的片段! – 2012-01-16 14:33:58

+0

我將用最終解決方案「編輯」,我接近它 – 2012-01-16 14:34:22

+0

然後,您將不得不使用'GetInterface()',然後查看我的更新答案。 – 2012-01-16 14:36:54

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

這照顧你有關重命名接口的關注。沒有字符串文字,因此Visual Studio中的重命名應更新您的搜索表達式。