2011-03-18 95 views
5

有沒有其他人認爲它可能是有用的,如果運行時允許引用通用接口的非特定於泛型類型的成員?我知道通常的「解決方法」是創建一個非通用接口作爲通用接口的基礎,但是有沒有一個針對基本接口基本上是自動的有效理由?對通用接口的抽象引用

例如,考慮到如下界面:

public interface IProcessor<T> 
{ 
    string Name { get; } 
    void Process(T item); 
} 

我認爲這將是方便的自動允許這樣的事情:

public void LogProcessor(IProcessor<> item) 
{ 
     Trace.WriteLine(item.Name); 
} 

我很好奇,聽到反對這個論點(其他比「停止這麼懶惰,只是寫基本接口」)。

+1

它會怎麼知道你的意思呢? – 2011-03-18 19:38:26

+1

似乎要處理這樣的功能,C#必須變成動態類型。 – 2011-03-18 19:41:04

+1

Paul Sasik。編譯後的這些代碼可以生成泛型的基礎接口。這是想法,但可能會導致一些問題... – Evgeny 2011-03-18 19:44:31

回答

7

您可以只使用一個通用的方法:

public void LogProcessor<T>(IProcessor<T> item) 
{ 
    Trace.WriteLine(item.Name); 
} 
+0

我可以,但是我不知道T是什麼的背景呢?例如,如果我想動態加載(和記錄名稱)實現IProcessor <>接口的程序集中的所有類(我可以使用t.GetInterface(typeof(IProcessor <>))來檢查接口名稱) != null)? – WuffaloWill 2011-03-18 20:26:03

+0

@WuffaloWIll:您可以檢查通用方法,然後使用反射來調用泛型方法(使用MethodInfo.MakeGenericMethod的適當類型:http://msdn.microsoft.com/zh-cn/library/system.reflection。 methodinfo.makegenericmethod.aspx)。這不太好,但它在很多情況下都可以使用。但是,對於沒有使用重新驗證的普通API,此功能完美無缺。 – 2011-03-18 21:15:39

+0

@ Reed-感謝您的回覆。我明白如何在「正常API」中使用泛型方法;我想我應該把我最初的回答說成是「我不關心T是什麼環境?」 – WuffaloWill 2011-03-21 21:05:37

0

的主要原因是沒有共同語言規範。添加這些東西是微軟框架開發人員工作和測試的重要組成部分。所以更簡單的是添加基礎界面。 但無論如何,你可以發佈你的想法到微軟論壇