如何在C#3.5中对泛型方法设置接口约束?

时间:2009-07-09 14:27:17

标签: c# generics interface constraints

我希望在C#3.5中实现这样的目标:

public void Register<T>() : where T : interface {}

我可以用类或结构来做,但是如何使用接口呢?

4 个答案:

答案 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
  • 我将通用T参数约束为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
    }