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
因此,访问list1[1]
将在声明包含string
s的列表中返回一个盒装int
。
因此,不允许此强制转换,因为它会破坏类型系统。
(作为旁注,在where t : class, base
的子句where t : class, base
,您不需要指定class
base
本身是一个引用类型,因此class
约束是多余的。)