我想實現一個通用函數,通用約束是傳入的類型是一個接口。這在C#中可能嗎?我沒有約束,它工作正常,但代碼將在運行時失敗,如果它不是一個接口,所以我想編譯時檢查。泛型函數其中泛型類型是任何接口
public T MyFunction<T> where T : {any interface type} { return null; }
我想實現一個通用函數,通用約束是傳入的類型是一個接口。這在C#中可能嗎?我沒有約束,它工作正常,但代碼將在運行時失敗,如果它不是一個接口,所以我想編譯時檢查。泛型函數其中泛型類型是任何接口
public T MyFunction<T> where T : {any interface type} { return null; }
您可以將類型限制爲特定的界面,但不限制爲「任何」任意界面。
// 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");
// ...
}
優秀。謝謝。 – 2010-06-18 17:39:29
不,沒有辦法將類型限制爲只有接口。
你必須使用一個特定的接口。您可以創建一個基本接口,以便您的所有其他接口派生並將其用作約束。
我很好奇你想做什麼? – BFree 2010-06-18 17:27:47
如果對象沒有實現任何接口,你如何在運行時創建失敗的代碼? – 2010-06-18 17:30:52
這是一個名爲InterfaceLoader的類,它有一個公共靜態方法。它採用一條路徑,通過它來查找該路徑中的所有程序集,該程序集中的類型實現了泛型中指定的接口。然後它通過無參數構造函數創建一個實例,並返回指定泛型類型的IEnumerable。 工作正常沒有約束,但我也希望編譯時檢查也。 –
2010-06-18 17:33:00