簡體   English   中英

Activator.CreateInstance(...)未找到參數化構造函數

[英]Activator.CreateInstance(…) is not finding parameterized constructor

給出以下示例代碼;

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提供的參數不會導致它找到正確的構造函數。 有人有任何想法嗎?

基本上, 您調用方法的第二個參數是params數組 發生的事情是C#編譯器正在處理你的方法調用,好像你是在使用“未擴展”形式傳遞這個參數,即傳遞一個null數組引用。 另一方面,您的意圖是使用“展開”形式,即將引用傳遞給包含單個空引用的數組。

你可以哄騙編譯器做你想做的事情:

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

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

你必須傳遞構造函數參數:

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

MyChildClass需要一個類型為object的參數作為其構造函數 - 您必須在數組中傳遞此參數。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM