我在考虑一种通用方法,其中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)
答案 0 :(得分:4)
不,你不能这样做。您可以在执行时测试它:
if (!typeof(T).IsInterface)
{
throw ...;
}
...但您无法将其表达为T
上的编译时约束。
答案 1 :(得分:4)
这在当前的C#中是不可能的。
你唯一能做的就是在运行时验证事实,使用像
这样的东西if (!typeof(T).IsInterface) throw new ArgumentException("T must be an interface");
(注意,没有TypeArgumentException
可能是更好的选择,我想。)