6

这是我的通用方法代码:

  public static IT Activate<IT>(string path)
  {
        //some code here....
  }

我想设置通用 IT 必须只是一个接口。

这可能吗?

4

4 回答 4

7

不,C# 或一般的 .NET 泛型中没有这样的约束。您必须在执行时检查。

if (!typeof(IT).IsInterface)
{
    // Presumably throw an exception
}
于 2012-10-04T15:27:31.460 回答
3

不,您不能IT单独限制任何接口类型和接口。最接近的是class约束,它适用to any class, interface, delegate, or array type.- http://msdn.microsoft.com/en-us/library/d5x73970.aspx

于 2012-10-04T15:28:14.873 回答
1

我能想到的最接近的事情是静态构造函数中的运行时检查。像这样:

static MyClass<IT>()
{
    if(!typeof(IT).IsInterface)
    {
        throw new WhateverException("Oi, only use interfaces.");
    }
}

希望使用静态构造器意味着它会很快失败,因此开发人员会更快地发现错误。

此外,检查只会对每种类型的 IT 运行一次,而不是每个方法调用。所以不会受到性能影响。

于 2012-10-04T15:31:27.380 回答
0

我刚刚对基本接口的使用进行了快速测试。这是可能的,但正如我所说,不确定这是否值得努力,或者即使这是一种好的做法。

public interface IBaseInterface
{
}

public interface IInterface1 : IBaseInterface
{
        //some code here.... 
}

public interface IInterface2
{
        //some code here.... 
}

public class Class1
{
    public void Test()
    {
        Activate<IInterface1>("myPath");
        //Activate<IInterface2>("myPath"); ==> doesn't compile
    }

    public static IT Activate<IT>(string path) where IT : IBaseInterface
    {
        //some code here.... 
    }
}
于 2012-10-04T16:14:56.743 回答