1
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<_dependencies> ,它只是一个 FieldDependency 实例的列表,还试图发送一个类型为 Node 的 rootNode

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

4

2 回答 2

3

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

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

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

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

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

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

这意味着所有的使用TList都被用户指定的任何类型所取代,但这种类型必须实现IList<T2>。例如,如果TList是,ReadOnlyCollection<MyNode>那么 IntelliSense 将显示(并且编译器将验证)只有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。要指定您希望允许引用类型和所有值类型,请不要指定class或根本不指定struct


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

public class MyClass<T>
{
}
于 2013-03-31T08:12:27.620 回答
0

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

public class GenericBuildService<T, T2>
    where T : IList<T2>
    where T2 : INode
{
}
于 2013-03-31T08:08:47.497 回答