2010-06-18 146 views
3

我想實現一個通用函數,通用約束是傳入的類型是一個接口。這在C#中可能嗎?我沒有約束,它工作正常,但代碼將在運行時失敗,如果它不是一個接口,所以我想編譯時檢查。泛型函數其中泛型類型是任何接口

public T MyFunction<T> where T : {any interface type} { return null; } 
+2

我很好奇你想做什麼? – BFree 2010-06-18 17:27:47

+0

如果對象沒有實現任何接口,你如何在運行時創建失敗的代碼? – 2010-06-18 17:30:52

+0

這是一個名爲InterfaceLoader的類,它有一個公共靜態方法。它採用一條路徑,通過它來查找該路徑中的所有程序集,該程序集中的類型實現了泛型中指定的接口。然後它通過無參數構造函數創建一個實例,並返回指定泛型類型的IEnumerable 。 工作正常沒有約束,但我也希望編譯時檢查也。 – 2010-06-18 17:33:00

回答

7

您可以將類型限制爲特定的界面,但不限制爲「任何」任意界面。

// This is allowable 
public T MyFunction<T>() where T : IMyInterface { return null; } 

這將允許您傳遞任何實現該特定接口的對象。


編輯:

考慮你的目標,從評論,我個人可能只是把一些運行時檢查:

public IEnumerable<T> LoadInterfaceImplementations<T>() 
{ 
    Type type = typeof(T); 
    if (!type.IsInterface) 
     throw new ArgumentException("The type must be an Interface"); 

    // ... 
} 
+0

優秀。謝謝。 – 2010-06-18 17:39:29

5

不,沒有辦法將類型限制爲只有接口。

1

你必須使用一個特定的接口。您可以創建一個基本接口,以便您的所有其他接口派生並將其用作約束。