如何在泛型类定义中指定2个位置

本文关键字:2个 位置 定义 泛型类 | 更新日期: 2023-09-27 18:06:35

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

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

不知道如何指定,当我已经在这里有一个where for IList。

更新:

我只是想进一步澄清一下我的目标是什么。我需要这个服务类需要一个IList,也需要一个myCustomType的rootNode,因为我需要能够在这个类中的各种方法中工作,原因多种多样……所以我试着像这样发送这些实例但显然我的类定义还没有构造好因为它不喜欢我对这个类的使用:

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

我试着发送一个IList<_dependencies>这是一个FieldDependency实例列表同时我试着发送一个rootNode类型为Node

所以不太确定如果我形成我的类定义正好适合构建服务类,有人知道如何解决这个问题吗?

如何在泛型类定义中指定2个位置

可以在方法和属性的泛型中使用类型参数。例如,如果您有一个接受IList<T>的方法,其中T是您的类型参数,您可以简单地这样做:

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

然后如果T是,例如,MyNode,智能感知将显示(和编译器将验证)只有实现IList<MyNode>的东西被传递给你的构造函数(或使用T的其他成员):

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

要指定多个,其中约束不同的类型参数,可以重复where关键字:

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

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

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

要在单个类型参数上指定多个约束,它们之间用逗号分隔。首先指定特殊约束(struct, class),类约束在接口之前,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>
{
}

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

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