2012-02-09 64 views
3

我在想一個通用的方法,其中T應該是接口,但它可以IFACE指定泛型其中T應該是接口

public static T Get<T>(SomeClass foo) where T : IFace { 
    if(smthing) 
    return Activator.CreateInstance(type, true); 
} 

這樣的後代,我可以打電話

Class.Get<IFace>(smth) 
Class.Get<IFaceDescend>(smt) 

但不

Class.Get<Class2>(smt) 
+0

可能[我如何使用接口作爲C#泛型約束?](http://stackoverflow.com/questions/1096568/how-can-i-use-interface-as-ac-sharp-generic-type-constraint ) – ken2k 2012-02-09 10:53:52

+0

@ ken2k哦,是的,我沒有找到它,浪費我的時間問:( – Zavael 2012-02-09 11:39:24

回答

4

不,你不能這樣做。您可以在執行時測試了這個問題:

if (!typeof(T).IsInterface) 
{ 
    throw ...; 
} 

...但你不能表達它作爲T編譯時間約束。

+0

謝謝你的回答,+1 – Zavael 2012-02-09 11:36:09

+1

@Zavael看到我的答案(http:// stack overflow.com/a/9164633/385844)複製問題的方法,可以避免每次調用方法時檢查'typeof(T).IsInterface'。 – phoog 2012-02-10 00:29:33

4

這在目前的C#中是不可能的。

你能做的唯一一件事就是驗證上運行的事實,使用類似

if (!typeof(T).IsInterface) throw new ArgumentException("T must be an interface"); 

(注意,沒有TypeArgumentException這可能是一個更好的選擇,我猜。)

+0

好的感謝IsInterface,這是足夠的:) – Zavael 2012-02-09 11:35:20