指定T应该是接口的泛型

时间:2012-02-09 10:49:18

标签: c# generics interface

我在考虑一种通用方法,其中T应该是接口,但它可以是IFace的后代

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)

2 个答案:

答案 0 :(得分:4)

不,你不能这样做。您可以在执行时测试它:

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

...但您无法将其表达为T上的编译时约束。

答案 1 :(得分:4)

这在当前的C#中是不可能的。

你唯一能做的就是在运行时验证事实,使用像

这样的东西
if (!typeof(T).IsInterface) throw new ArgumentException("T must be an interface");

(注意,没有TypeArgumentException可能是更好的选择,我想。)