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
约束是多余的。)