C# 有没有办法从变量向泛型类添加类型约束?

C# 有没有办法从变量向泛型类添加类型约束?,c#,.net,C#,.net,有没有办法从变量向泛型类添加类型约束 class GenericClass<{X}> { } class泛型类 { } 例如,{X}是一个数组,其类型如下:Object1、Object2、String您不能对数组进行约束 数组不是一种真正的类型,它是一种错误的类型:一种原始的基本内存数据结构,就像一列以货车为单元的火车,即使array是一个用来操作它们的类 在IL生成的代码中,new关键字的用法在newarr操作数中转置: 类类型:不创建实例,只为默认为null的引用分配单元格

有没有办法从变量向泛型类添加类型约束

class GenericClass<{X}>
{
}
class泛型类
{
}

例如,{X}是一个数组,其类型如下:Object1、Object2、String

您不能对数组进行约束

数组不是一种真正的类型,它是一种错误的类型:一种原始的基本内存数据结构,就像一列以货车为单元的火车,即使
array
是一个用来操作它们的类

在IL生成的代码中,
new
关键字的用法在
newarr
操作数中转置:

  • 类类型:不创建实例,只为默认为null的引用分配单元格

  • 值类型:不创建实例,仅为值分配单元格

泛型类型参数约束必须对实类型执行

您可以使用
列表
,它是数组概念的通用面向对象实现(实际上是数组的包装器)

例如,您可以编写:

class MustHaveConstraints<X>
where X : List<string>` 
{
}
类必须有约束
其中X:List`
{
}
但它是无用的

因此,你可以写:

class MustHaveConstraints<T1, T2>
where T1: List<T2>
{
}

var instance1 = new MustHaveConstraints<List<object>, object>();
var instance2 = new MustHaveConstraints<List<int>, int>();
var instance3 = new MustHaveConstraints<List<string>, string>();
var instance4 = new MustHaveConstraints<List<bool[]>, bool[]>();
类必须有约束
其中T1:List
{
}
var instance1=新的MustHaveConstraints();
var instance2=新的MustHaveConstraints();
var instance3=新的MustHaveConstraints();
var instance4=新的MustHaveConstraints();

static void Test()
{
var arr1=新整数[10];
var arr2=新列表[10];
var arr3=新数据[10];
var实例=新列表();
}
公共结构数据
{
公共价值观;
}
/\uu=newint[10];
IL_0000:ldc.i4.s 10
IL_0002:newarr[mscorlib]System.Int32
IL_0007:流行音乐
//_u=新列表[10];
IL_0008:ldc.i4.s 10
IL_000a:newarr类[mscorlib]System.Collections.Generic.List`1
IL_000f:流行音乐
//_u=新数据[10];
IL_0010:ldc.i4.s 10
IL_0012:newarr ConsoleApp.Program/Data
IL_0017:流行音乐
//新列表();
IL_0018:newobj实例无效类[mscorlib]System.Collections.Generic.List`1::.ctor()


像这样的怎么样

class Class1 : IConstraint {}

class Class2 : IConstraint {}

interface IConstraint {}

class MustHaveConstraints<T> where T : IConstraint {}
class Class1:IConstraint{}
类2:IConstraint{}
接口IConstraint{}
类必须具有约束,其中T:IConstraint{}
如果您的类型只是类,那么这种实现将更加灵活

更新


正如@DRapp所建议的,这也可以通过类来实现。基本上,当您定义泛型类型时,您可以使用约束添加使用限制。有关更多详细信息,请检查此

作为对我自己问题的回答,是的,这是可能的,但不是以常规方式。必须使用文本模板来生成这些类

<#@ var types = "T1, T2, T3"; #>
namespace Generics 
{ 
    class GenericClass<<#=types#>> 
    { 
    } 
}

命名空间泛型
{ 
类泛型类
{ 
} 
}

您想用它做什么?我相信我刚刚回答了我自己的问题,我可以使用文本模板生成这些类,在这些类中我可以定义我需要的类型作为数组。您可以生成静态.cs文件,然后加载它们,或者在运行时有效地创建您的类型。也许您可以在运行时为该解决方案创建对象,但实际上不可能。除了接口之外,WHERE还可以应用于派生其他类的基类。我建议您编辑您的答案,并展示该场景。。。例:动物类、狗、猫等亚类。。。它们都是动物,每个都可以有自己的定制组件。
class Class1 : IConstraint {}

class Class2 : IConstraint {}

interface IConstraint {}

class MustHaveConstraints<T> where T : IConstraint {}
<#@ var types = "T1, T2, T3"; #>
namespace Generics 
{ 
    class GenericClass<<#=types#>> 
    { 
    } 
}