背景
即使可以在运行时编译 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
}