我注意到使用接口列表作为构造函数参数的泛型类的奇怪行为。
假设我们有以下课程
public class GenericClass<T> where T : IInterface
{
public GenericClass(int inInt, List<T> inList){
}
public GenericClass(int inInt, object inObject){
}
}
当我尝试创建这样的实例时(tmpType实现
IInterface
):IEnumerable<IInterface> tmpSomeObjects = xy;
Activator.CreateInstance(typeof(GenericClass<>).MakeGenericType(tmpType), 5, (List<IInterface>)tmpSomeObjects);
第二个构造函数将被调用(int,对象)。
我可能错过了重要的一点……我希望第一个构造函数被执行。
最佳答案
您的IEnumerable
类型为IEnumerable<IInterface>
,但是您正在构造的类型具有派生类型的泛型参数,因此它与确切的构造函数不匹配。
假设T
是Foo
(实现IInterface
),则您的类型变为:
public class GenericClass<Foo>
{
public GenericClass(int inInt, List<Foo> inList){
}
public GenericClass(int inInt, object inObject){
}
}
但是,您正在传递一个不匹配
IEnumerable<IInterface>
的List<IInterface>
(或List<Foo>
),所以这就是为什么它更喜欢object
的原因(不仅它是首选的……其他构造函数在所有)。尝试:用
object
删除构造函数,然后尝试执行以下操作:var list = new List<IInterface>();
var x = new GenericClass<TypeImplementingIInterface>(5, list);
那甚至不会编译。
因此,您的情况下的解决方案将很简单...在构造函数
IEnumerable<IInterface>
中而不是List<T>
中构造参数,这实际上是您想要传递的参数关于c# - 激活器创建通用实例,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/50041529/