2

DynamicMethodを使用して小さなコード生成を行っていますが、フィールドなどの小さな状態を追加することで簡単に解決できる問題があります。残念ながら、この状態をメソッドのパラメーターの1つにプッシュすることはできないため、基本的に、この小さなラムダのようなローカルを閉じる必要があります。

var i = 0;
return new Func<int>(() => i++);

これを行う最も簡単な方法は何ですか?

4

1 に答える 1

2

少なくとも直接では、それはできないと思います。DynamicMethod単一のCLRメソッドのみを作成できます。C#メソッドにはその制限はなく、クロージャータイプとフィールド、およびその他の必要なものを自由に作成できます。

TypeBuilder必要なことを実現するために、メソッドとフィールドを使用して完全な型を動的に構築するために使用できます。

ただし、より簡単なオプションは、状態をパラメーターとして使用してメソッドを作成し、クロージャー(または通常のオブジェクト)を使用して状態をキャプチャすることです。何かのようなもの:

Action<TData> CaptureState<TState, TData>(
    Action<TState, TData> originalAction, TState initialState)
{
    var state = initialState;
    return data => originalAction(state, data);
}

次に、次のように使用します。

Action<State, string> generated = …;
Action<string> captured = CaptureState(generated, new State());
captured("data1");
captured("data2");

メソッドが状態の値を変更する必要がある場合(およびその状態の一部のプロパティを変更するだけでなく)、ref状態のパラメーターを使用する必要がありますが、原則は同じように機能します(つまり、カスタムを使用する必要があることも意味します)デリゲートタイプ)。

于 2012-10-06T15:43:15.427 に答える