2010-06-18 131 views
3

我想实现一个通用函数,通用约束是传入的类型是一个接口。这在C#中可能吗?我没有约束,它工作正常,但代码将在运行时失败,如果它不是一个接口,所以我想编译时检查。泛型函数其中泛型类型是任何接口

public T MyFunction<T> where T : {any interface type} { return null; } 
+2

我很好奇你想做什么? – BFree 2010-06-18 17:27:47

+0

如果对象没有实现任何接口,你如何在运行时创建失败的代码? – 2010-06-18 17:30:52

+0

这是一个名为InterfaceLoader的类,它有一个公共静态方法。它采用一条路径,通过它来查找该路径中的所有程序集,该程序集中的类型实现了泛型中指定的接口。然后它通过无参数构造函数创建一个实例,并返回指定泛型类型的IEnumerable 。 工作正常没有约束,但我也希望编译时检查也。 – 2010-06-18 17:33:00

回答

7

您可以将类型限制为特定的界面,但不限制为“任何”任意界面。

// 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"); 

    // ... 
} 
+0

优秀。谢谢。 – 2010-06-18 17:39:29

5

不,没有办法将类型限制为只有接口。

1

你必须使用一个特定的接口。您可以创建一个基本接口,以便您的所有其他接口派生并将其用作约束。