バックグラウンド
実行時に C# コードをコンパイルすることはできますが、生成されたコードを現在のスコープに含めて実行することはできません。代わりに、すべての変数を明示的なパラメーターとして渡す必要があります。
Python のような動的プログラミング言語と比較すると、eval(この例のように) の完全な動作を真に再現することはできません。
x = 42
print(eval("x + 1")) # Prints 43
質問
したがって、私の質問は (実際に役立つかどうかに関係なく ;)) 、リフレクションを使用して .NET で動的スコープを模倣できるかどうかです。
.NET はDiagnostics.StackTrace呼び出しメソッドを検査できるクラスを提供するので、この質問は次のように要約されます: (どのように) 呼び出しメソッドのローカルに確実にアクセスできますか?
スタック トレースは、メモリ オフセットを計算するのに十分な情報を提供してくれますか、それともマネージ コードではそのようなことは禁止されていますか?
そのようなコードは何とか可能ですか?
void Foo() {
int x = 42;
Console.WriteLine(Bar());
}
int Bar() {
return (int)(DynamicScope.Resolve("x")); // Will access Foo's x = 42
}