当它说明这一点时,似乎我必须同意这篇文章
[...]动态类型语言中的代码遵循静态类型约定
我遇到的很多动态语言代码确实看起来非常静态(思考PHP),而动态方法看起来有些笨拙或不必要.
大多数情况下,它只是省略类型签名,在类型推断/结构类型的上下文中,甚至根本不必暗示动态类型.
所以我的问题(并不意味着过于主观)是动态语言或应用领域都是这些更高级的动态语言特性(不能在静态/编译语言中轻松复制)实际上和在语言上使用.
例子:
这些技术的有用应用是什么?
即使可以在运行时编译C#代码,也不可能在当前范围中包含和运行生成的代码.相反,所有变量都必须作为显式参数传递.
与像Python这样的动态编程语言相比,人们永远无法真正复制完整的行为eval(如本例所示).
x = 42
print(eval("x + 1")) # Prints 43
Run Code Online (Sandbox Code Playgroud)
所以我的问题是(无论它是否真的有用;))是否可以通过使用反射来模拟.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
}
Run Code Online (Sandbox Code Playgroud)