2012-02-03 16 views
0

Reflection Emitパッケージを使用してクラスを作成する必要が非常に複雑です。このクラスは単純なDTOであり、サービスを定義するためにWCFで使用されます。シンプル、本当に。ただし、にネストされたタイプを使用する必要があります。Reflection.Emitを使用してネストされた型を作成する方法

私の現在のテストは機能しません。メインの型を作成することはできますが、入れ子型は作成できません。

var serviceClassBuilder = _module.DefineType("something", TypeAttributes.Public | TypeAttributes.Class); 

// Create a nested class that will hold the input definition 
var nested_type_builder = serviceClassBuilder.DefineNestedType(className, 
    TypeAttributes.NestedPublic | TypeAttributes.Class | 
    TypeAttributes.SequentialLayout); 

serviceClassBuilder.CreateType(); // <-- NOT WHAT I EXPECTED! 

作成されたクラスにはネストされたタイプはありません。出来ますか?クラスは上記のように簡単です。私はEmitパッケージのいくつかの制限を読んだことがありますが、私が使用したような簡単な例には当てはまりません。

私も作成タイプの前に以下の行を追加しようとした:

nested_type_builder.CreateType(); 

私は最初のビルダーはにCreateTypeのカスケード実行をやるべきだと思うにもかかわらず、すべての後、私が呼び出す必要はありませんがメソッドを作成するもの、型をホストするアセンブリなど

答えて

0

まず、nested_type_builder.CreateType()に電話する必要があると思います。そうしないと、例外が発生します。

私がそれをしたら、それは不思議に思った。 TypeserviceClassBuilder.CreateType()から返された場合、少なくとも少なくともGetNestedTypes()を使用して見た場合、ネストされた型は含まれていないようです。 しかし、実際にディスクにアセンブリを保存して見た場合、ネストされた型は正確に必要なとおりに格納されます。

したがって、生成されたアセンブリファイルで作業する必要がある場合は、正常であるはずです。私はTypeBuilderによって返されたタイプのGetNestedTypes()の振る舞いはバグだと思う。

+0

ディスクに保存することはありませんでした。私はそれを試みます。私は実行中に型が必要ですが、これまではdllを保存してからロードすることに問題はありませんでした。 –

+0

Ow、もう1つのこと: 'serviceClassBuilder.CreateType()' **の前に 'nested_type_builder.CreateType()'を呼び出さないと**例外が発生しません。私の推測はすべきです。 –

+0

奇妙なことに、私のために例外が発生しました。 – svick

関連する問題