Activator.CreateInstance(...)未找到参数化构造函数

时间:2012-02-29 14:41:23

标签: c# reflection

给出以下示例代码;

class Program
{
    static void Main(string[] args)
    {
        var results = GetChildren().ToList();
    }

    static IEnumerable<MyBaseClass> GetChildren()
    {
        return Assembly.GetExecutingAssembly()
            .GetTypes()
            .Where(t => t.BaseType == typeof(MyBaseClass))
            .Select(o => (MyBaseClass)Activator.CreateInstance(o, null));
    }
}

abstract class MyBaseClass
{ }

class MyChildClass : MyBaseClass
{
    public MyChildClass(object paramOne)
    {

    }
}

我收到以下错误;

  

MissingMethodException:找不到“CreateInstanceCtorIssue.MyChildClass”类型的构造函数。

但是,如果我添加一个无参数构造函数,它会创建对象OK。

我正在尝试弄清楚为什么我要为CreateInstance提供的参数不会导致它找到正确的构造函数。有人有任何想法吗?

2 个答案:

答案 0 :(得分:10)

基本上,method you are calling的第二个参数是params array。发生的事情是C#编译器正在处理你的方法调用,好像你是在使用“未扩展”形式传递这个参数,即通过传递null数组引用。另一方面,您的意图是使用“展开”形式,即将引用传递给包含单个空引用的数组。

您可以哄骗编译器执行您想要的操作:

// Unexpanded:
Activator.CreateInstance(o, new object[] { null })

// Expanded explictly:
Activator.CreateInstance(o, (object) null )

答案 1 :(得分:3)

您必须传递构造函数参数:

.Select(o => (MyBaseClass)Activator.CreateInstance(o, new object[] { someParam }));

MyChildClass期望为其构造函数设置一个object类型的参数 - 您必须在数组中传递此参数。