我注意到使用接口列表作为构造函数参数的泛型类的奇怪行为。

假设我们有以下课程

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>,但是您正在构造的类型具有派生类型的泛型参数,因此它与确切的构造函数不匹配。

假设TFoo(实现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/

10-11 10:30