2016-04-27 125 views
0

我正在生成新的動態類型,並且不想創建它的實例。但是,當實際創建實例化代碼,它的失敗例外:No parameterless constructor defined for this object.無法創建生成類型的實例:沒有爲此對象定義的無參數構造函數

我的代碼如下:

AssemblyBuilder aBuilder = AssemblyBuilder.DefineDynamicAssembly(new AssemblyName("dfsdfsdf"), AssemblyBuilderAccess.Run); 
ModuleBuilder mBuilder = aBuilder.DefineDynamicModule("dsadsadasdasda"); 
TypeBuilder typeBlank = mBuilder.DefineType("dasvvvvvvvv", TypeAttributes.Class | TypeAttributes.Public); 
ConstructorBuilder cb = typeBlank.DefineDefaultConstructor(MethodAttributes.Public); 
Type t = cb.GetType(); 
var item = Activator.CreateInstance(t); // <--- Error appear in this line. 

有什麼不對呢?

+0

究竟哪一行出現此錯誤? –

+0

在最後一個 –

+2

你試過定義一個無參數的構造函數嗎? :O – Kritner

回答

6

您正試圖創建ConstructorBuilder的實例,而不是您生成的類。

我想你想:

... 
ConstructorBuilder cb = typeBlank.DefineDefaultConstructor(MethodAttributes.Public); 
Type t = typeBlank.CreateType(); 
var item = Activator.CreateInstance(t); 

注意,無參數的默認構造函數是默認創建的;你不需要建立一個除下列情況:

(從MSDN):

因爲默認構造函數自動定義,有必要 只有在以下情況下調用此方法:

  • 您已經定義了另一個構造函數,並且您還需要一個只調用基類構造函數的默認構造函數。
  • 要在默認的構造函數的屬性設置爲PrivateScopePublicHideBySigSpecialName, 和RTSpecialName以外的東西。
+0

謝謝,是的,這是正確的。只是嘗試了一些事情,並錯過了GetType()和CreateType()返回不同的結果。順便說一句,還有一個問題 - 也許你只是知道答案,因爲我無法找到它。有這種類型的動態組裝。如果我沒有這些程序集的assemblyBuilder實例,是否有機會在將來以某種方式添加更多的類型?我需要生成僞裝類型以便組裝測試,對於我來說能夠動態添加/刪除它非常重要。 –

+0

@silent_coder如果你有另一個問題,你應該*提出一個新的問題*。 – svick

相關問題