我想实现一个通用函数,通用约束是传入的类型是一个接口。这在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