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所以不太确定我是否正在构建适合构建服务类的类定义,有谁知道如何解决这个问题?
答案 0 :(得分:3)
您可以在方法和属性中使用泛型类型中的类型参数。例如,如果您的方法接受IList<T>
,其中T
是您的类型参数,则可以执行以下操作:
public class GenericBuildService<T>
where T : INode
{
GenericBuildService(IList<T> dependencies, T rootNode);
}
然后,如果T
是MyNode
,则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>
。例如,如果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>
{
}
答案 1 :(得分:0)
您可以指定多个where约束,每个类型参数一个:
public class GenericBuildService<T, T2>
where T : IList<T2>
where T2 : INode
{
}