Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/292.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# Activator.CreateInstance(…)未找到参数化构造函数_C#_Reflection - Fatal编程技术网

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

C# Activator.CreateInstance(…)未找到参数化构造函数,c#,reflection,C#,Reflection,给出以下示例代码 class Program { static void Main(string[] args) { var results = GetChildren().ToList(); } static IEnumerable<MyBaseClass> GetChildren() { return Assembly.GetExecutingAssembly() .GetTypes

给出以下示例代码

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)
    {

    }
}
类程序
{
静态void Main(字符串[]参数)
{
var results=GetChildren().ToList();
}
静态IEnumerable GetChildren()
{
返回Assembly.getExecutionGassembly()
.GetTypes()
.Where(t=>t.BaseType==typeof(MyBaseClass))
.Select(o=>(MyBaseClass)Activator.CreateInstance(o,null));
}
}
抽象类MyBaseClass
{ }
类MyChildClass:MyBaseClass
{
公共MyChildClass(对象参数)
{
}
}
我收到以下错误

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

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


我试图找出为什么我提供给CreateInstance的参数没有导致它找到正确的构造函数。有人有什么想法吗?

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

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

MyChildClass
的构造函数需要一个object类型的参数-您必须在数组中传递此参数

基本上,的第二个参数是a。发生的情况是,C#编译器将您的方法调用视为使用“未展开”形式传递此参数,即通过传递
null
数组引用。另一方面,您的目的是使用“扩展”形式,即将引用传递给包含单个空引用的数组

您可以通过以下方式引导编译器执行所需操作:

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

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

这应该是可行的:
Activator.CreateInstance(o,(object)null)
这确实是个问题,非常感谢。我刚才假设编译器会解释我作为params数组的一部分传递的null,这显然是不正确的。干杯请回答为什么必须在数组中传递它。
CreateInstance
的第二个参数的
params
性质表明不必传入数组。同意。需要一些解释。通常,您不必将参数显式限定为[],只需传入param1、param2即可。这就是params存在的原因,为什么这里有必要?