C# Unity registerType中泛型参数的多态解析

C# Unity registerType中泛型参数的多态解析,c#,generics,inversion-of-control,unity-container,C#,Generics,Inversion Of Control,Unity Container,我正在尝试做以下事情,但失败了: class base {} class derived1 : base {} class derived2 : base {} interface itr<t> where t : class, base {} class c1: itr<derived1> {} class c2 : itr<derived2> {} 类基类{} 类derived1:基{} 类derived2:基{} 接口itr 其中t:类,

我正在尝试做以下事情,但失败了:

class base {}

class derived1 : base {}

class derived2 : base {}

interface itr<t>
where t : class, base
{}

class c1: itr<derived1>
{}

class c2 : itr<derived2>
{}  
类基类{}
类derived1:基{}
类derived2:基{}
接口itr
其中t:类,基
{}
c1类:itr
{}
c2类:itr
{}  
//以下两个注册失败:

_unityContainer.RegisterType<itr<base>, c1>("c1");

_unityContainer.RegisterType<itr<base>, c2>("c2");
\u unityContainer.RegisterType(“c1”);
_unityContainer.RegisterType(“c2”);
我得到的错误是,上述注册中的第二个参数无法类型转换为第一个参数,并且该注册无效。有什么建议吗?

我需要执行上述操作,而不是将derived1或derived2类注册为泛型参数,因为在解析时,我不想知道要解析的确切派生类型。我只想多态地使用基类型方法。

您不能这样做,因为泛型是不协变的。也就是说,类型
itr
不能转换为
itr
,即使
derived1
可以转换为
base

下面是一个使用框架
List
类的示例:

List<string> list1 = new List<string>();
list1.Add("Hello, World!");

// This cast will fail, because the following line would then be legal:
List<object> list2 = (List<object>)list1; 

// ints are objects, but they are not strings!
list2.Add(1);
List list1=新列表();
列表1.Add(“你好,世界!”);
//此强制转换将失败,因为以下行将是合法的:
List list2=(List)list1;
//整数是对象,但不是字符串!
清单2.添加(1);
因此,访问
list1[1]
将在声明包含
string
s的列表中返回一个装箱的
int

因此,不允许此强制转换,因为它会破坏类型系统

(作为旁注,在子句
中,其中t:class,base
,您不需要指定
class
base
本身是引用类型,因此
class
约束是多余的。)