2012-02-29 69 views
7

給定以下示例代碼;Activator.CreateInstance(...)找不到參數化構造函數

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找不到。

但是,如果我添加無參數構造函數,它會創建對象確定。

我想解決爲什麼參數我suppiling CreateInstance不會導致它找到正確的構造函數。任何人有任何想法?

+1

這應該工作:'Activator.CreateInstance(O,(對象)空)' – Alex 2012-02-29 14:46:26

回答

10

基本上,method you are calling的第二個參數是params array。發生什麼事是C#編譯器正在處理你的方法調用,就好像你正在使用「未擴展」的形式傳遞這個參數,即通過傳遞一個null數組引用。另一方面,您的意圖是使用「擴展」形式,即將引用傳遞給包含單個空引用的數組。

您可以哄編譯器做你想做的是這樣的:

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

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

這確實是個問題,非常感謝。我只是假定編譯器會解釋我作爲params數組的一部分傳遞的null,當你考慮它時顯然是不正確的。乾杯! – 2012-02-29 14:59:00

+0

這節省了我的@@ s!我不能滿足這個足夠! – Cornelius 2015-10-15 17:56:30

3

你要通過構造函數的參數:

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

MyChildClass預計,它的構造類型的對象的一個​​參數 - 你必須在一個陣列中傳遞此參數。

+2

請回答*爲什麼*您必須通過它在一個數組中。 CreateInstance的第二個參數的'params'特性表明一個人不應該傳入一個數組。 – ErikE 2015-08-04 17:58:51

+0

同意。需要一些解釋。通常你不需要明確地將params限定爲[],而只需傳入param1,param2。畢竟,這是爲什麼params存在,所以爲什麼它在這裏是必要的? – 2017-01-12 07:22:34

相關問題