我希望在C#3.5中实现这样的目标:
public void Register<T>() : where T : interface {}
我可以用类或结构来做,但是如何使用接口呢?
答案 0 :(得分:6)
如果您要求向特定接口添加约束,那么这很简单:
public void Register<T>( T data ) where T : ISomeInterface
如果你问一个关键字是否像类或结构一样存在来限制T的可能类型范围,那就不可用了。
虽然你可以写:
public void Register<T>( T data ) where T : class // (or struct)
你不能写:
public void Register<T>( T data ) where T : interface
答案 1 :(得分:4)
C#和CLR不支持整体接口约束,但您可以将其约束到特定接口(请参阅其他答案)。你可以得到的最接近的是'class'并且在运行时使用反射检查类型我害怕。你为什么首先想要一个接口约束?
答案 2 :(得分:0)
你不能要求T是一个接口,所以你必须在运行时使用反射来断言它。
答案 3 :(得分:0)
如果可能的话,我选择了这样的解决方案。只有当您想要将几个特定接口(例如您有源访问权限的接口)作为通用参数传递时,它才有效。
IInterface
。IInterface
在源代码中,它看起来像这样:
您希望作为通用参数传递的任何接口:
public interface IWhatever : IInterface
{
// IWhatever specific declarations
}
IInterface:
public interface IInterface
{
// Nothing in here, keep moving
}
要放置类型约束的类:
public class WorldPieceGenerator<T> where T : IInterface
{
// Actual world piece generating code
}