我在两台不同的机器上运行以下程序:
static class Program
{
static void Main(string[] args)
{
Func<int> lambda = () => 5;
Console.WriteLine(lambda.GetMethodInfo().IsStatic);
Console.ReadLine();
}
}
在一台安装了 .NET 4.5 和 Visual Studio 2012 的机器上打印“true”,在另一台安装了 .NET Framework 4.6.2 和 Visual Studio 2015 的机器上打印“false”。
我认为如果匿名方法是在静态上下文中定义的,那么它们就是静态的。在最近的一些框架更新期间,这种变化是否(以记录的方式)?
我需要做的是在 lambda.GetMethodInfo()
上使用 Expression.Call
,在非静态情况下,这需要一个实例,在该实例上定义了 lambda。
如果我想使用 lambda.GetMethodInfo().Invoke
,我会遇到同样的问题。
我怎样才能得到这样的实例?
最佳答案
请记住,此 (lambdas) 是编译器功能,因此运行时框架版本不会产生影响。此外,因为这是一个编译器功能,所以 2012 年和 2015 年之间存在差异也就不足为奇了(当时引入了 Roslyn,它取代了大部分现有的编译器基础结构)。
我无法给出明确的理由来说明为什么它会在这里被特别更改(尽管我知道为了启用“编辑并继续”以在更多上下文中工作而进行了一些更改),但它从来都不是契约(Contract) 关于 lambda 是如何实现的。
How can I get such an instance?
嗯,lambda
是一个 Delegate
,并且它总是公开一个 Target
属性,当委托(delegate)如此绑定(bind)时它引用一个实例。
关于c# - 静态类中的匿名方法是非静态的?如何调用它?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42390336/