2012-03-07 8 views
0

オブジェクトを返すメソッドを持つ動的型を作成しています。私はこれを達成する方法を理解していません。ここでは、私がこれまで持っているものです。C#OpCodesを使用してオブジェクトを返すメソッドを生成する

// .. stuff to create type builder 



MethodBuilder builder = 
       typeBuilder.DefineMethod(
        method.Name, 
        MethodAttributes.Virtual | MethodAttributes.Public, 
        method.CallingConvention, 
        method.ReturnType, 
        typeArray1); 
      builder.InitLocals = true; 
ILGenerator gen = builder.GetILGenerator(); 
Object myObjectIdLikeToReturn = someMethodCall(); 
//gen.??(??????????) // here's where I'm lost 
gen.Emit(OpCodes.Ldloc_0); 
gen.Emit(OpCodes.Ret); 

私は正しいMSDNを読んでいた場合、私は、信じて、私は、スタック上myObjectIdLikeToReturnの参照を取得する必要があります - 私は運を持っていませんでしたが。誰かが私を正しい方向に向けることができますか?

編集:もっと明確にする。私はILに相当するものを書き込もうとしています:

public virtual Object MyNewMethod() { 
    return myObjectIdLikeToReturn; 
} 

答えて

2

あなたはこのラインがあります「スタックにmyObjectIdLikeToReturnへの参照を取得したい」あなたはあなたが言う

Object myObjectIdLikeToReturn = someMethodCall(); 

をしかし、それは不可能です。私はこれらのことが起こっているタイミングを混乱させていると思います。 IL生成コードは、をコンパイルするのに似ています。すべてを静的に知る必要があります。一方、myObjectIdLikeToReturnはコードを生成している間に存在するが、実際に生成されるクラスには意味を持たない変数です。あなたは任意のランタイムオブジェクトへの参照を「焼く」ことはできませんが、そのアイデアは意味をなさないだけです。

あなたの唯一の解決策は、どういうわけかILがsomeMethodCallへの呼び出しを実行することです。しかし、そのメソッドがどこにあるのか、生成された型との関連性が分からなければ、それをどのように実現するのかを正確に説明するのは難しいです。

関連する問題