Unity registerType中generics参数的多态分辨率

我正在尝试执行以下操作并失败:

class base {} class derived1 : base {} class derived2 : base {} interface itr where t : class, base {} class c1: itr {} class c2 : itr {} 

//以下2个注册失败:

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

我得到的错误是上述注册中的第二个参数不能被类型转换为第一个参数,并且该注册无效。 有关如何做到这一点的任何建议?
我需要执行上述操作,而不是使用derived1或derived2类作为通用参数进行注册,因为在解析时我不想知道我正在解析的确切派生类型。 我只想多态地使用基类型方法。

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

以下是使用框架List类的原因示例:

 List list1 = new List(); list1.Add("Hello, World!"); // This cast will fail, because the following line would then be legal: List list2 = (List)list1; // ints are objects, but they are not strings! list2.Add(1); 

因此,访问list1[1]将在声明包含string s的列表中返回一个盒装int

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

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