2012-03-26 6 views
2

いくつかの値でクラスのフィールドを設定する動的メソッドを生成しようとしています。通常のフィールドの型がstructの場合、次のように新しい構造体でフィールドを設定します。var myStruct = new SomeStruct();コンストラクタを持たない新しい構造体を生成する方法

しかし、私はその構造体のデフォルトのコンストラクタを見つけることができません。

var type  = valueForField.GetType  (); 

if(type.IsValueType && !type.IsPrimitive && !type.IsEnum) 
{ 
    emit 
     .ldarg_0 
     .newobj  (type.GetConstructor(Type.EmptyTypes)) 
     .stfld  (field); 

    continue; 
} 

それは理由NEWOBJ機能

にnullを渡すのライン.newobj (type.GetConstructor(Type.EmptyTypes))で失敗した誰もが、それはコンストラクタをデフォルトを通じて、新たな構造の作成を放出する方法を教えてもらえますか?

答えて

1

使用initobj

.ldarg_0 
.ldflda (field) 
.initobj (type) 

MSDNから:

値型は通常NEWOBJを使用して作成されていません。それらは通常、newarr(ゼロベース、1次元配列の場合)、またはオブジェクトのフィールドとして引数またはローカル変数のいずれかとして割り当てられます。一度割り当てられると、Initobjを使用して初期化されます。

0

Structは、実際のパラメータのないコンストラクタを持つことはできません。彼らはdefault(T)に相当する暗黙のデフォルトコンストラクタを持っています。

default(T)のIL当量がNEWOBJとは異なりinitobj

であるように、initobjはコンストラクタメソッドを呼び出していないようです。 Initobjは値の型を初期化するためのもので、newobjはオブジェクトの割り当てや初期化に使用されます。

+0

C#でパラメータのないコンストラクタを作成することはできませんが、.NETで行うことができますが、最初の文は間違いなく不正確です。 http://msmvps.com/blogs/jon_skeet/archive/2008/12/10/value-types-and-parameterless-constructors.aspxを参照してください。 – kvb

関連する問題