如何在泛型类定义中指定2 Wheres

时间:2013-03-31 08:05:53

标签: c# generics

public class GenericBuildService<T, T2> where T : IList<T2>

我还需要确保任何传入的T2都实现了INode。

当我已经在这里找到IList的位置时,不确定如何指定。

更新:

我只想更多地澄清我的目标是什么。我需要这个服务类来要求一个IList并且还需要一个myCustomType的rootNode,因为我需要能够在这个类中的各种方法中使用它们出于各种原因......所以我尝试像这样发送这些实例但很明显我还没有构建我的类定义,因为它不喜欢我对这个类的使用:

Node<FieldDependency> rootNode = new Node<FieldDependency>(_rootNode);
            var builder = new GenericBuildService<IList<FieldDependency>, FieldDependency>(_dependencies, rootNode);

所以我试图发送一个IList&lt; _dependencies&gt;它只是一个FieldDependency实例列表,也尝试发送一个类型为Node

的rootNode

所以不太确定我是否正在构建适合构建服务类的类定义,有谁知道如何解决这个问题?

2 个答案:

答案 0 :(得分:3)

您可以在方法和属性中使用泛型类型中的类型参数。例如,如果您的方法接受IList<T>,其中T是您的类型参数,则可以执行以下操作:

public class GenericBuildService<T>
    where T : INode
{
    GenericBuildService(IList<T> dependencies, T rootNode);
}

然后,如果TMyNode,则IntelliSense将显示(并且编译器将验证)只有实现IList<MyNode>的内容才会传递给您的构造函数(或其他成员)使用T):

GenericBuildService(IList<MyNode> dependencies, MyNode rootNode);

要为不同的类型参数指定多个where constraints,您可以重复where关键字:

public class GenericBuildService<T, T2>
    where T : INode
    where TList : IList<T>
{
    GenericBuildService(TList dependencies, T rootNode);
}

这意味着 TList的所有使用都将被用户指定的任何类型替换,但此类型必须实现IList<T2>。例如,如果TListReadOnlyCollection<MyNode>,那么IntelliSense将显示(并且编译器将验证)只有ReadOnlyCollection<MyNode>个对象传递给您的构造函数:

GenericBuildService(ReadOnlyCollection<MyNode> dependencies, MyNode rootNode);

要在单个类型参数上指定多个约束,请用逗号分隔它们。首先指定特殊约束(structclass),在接口之前指定类约束,最后指定new()

public class GenericBuildService<T, T2>
    where T : class, IList<T2>, new()
{
}

您可以递归地在约束中使用类型参数。

约束指定类型必须或实现的内容。他们的意思是:

  • class:仅允许引用类型。引用类型可以是null
  • struct:只允许使用不可为空的值类型。此类值类型不能为null
  • 类约束:类型必须扩展指定的类型。
  • 接口约束:类型必须实现指定的所有接口。
  • new():该类型必须具有无参数构造函数。所有值类型都有这样的构造函数,但引用类型可能有也可能没有。

您无法同时使用class struct。要指定您要允许引用类型和所有值类型,请不要指定classstruct


如果您没有泛型类型参数的任何类型约束,则无需添加where

public class MyClass<T>
{
}

答案 1 :(得分:0)

您可以指定多个where约束,每个类型参数一个:

public class GenericBuildService<T, T2>
    where T : IList<T2>
    where T2 : INode
{
}