c# - 静态类中的匿名方法是非静态的?如何调用它?

标签 c# .net reflection lambda

我在两台不同的机器上运行以下程序:

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/

相关文章:

c# - 访问 List<Class> 中类的属性

c# - Windows 应用程序的动画

c# - 将泛型 IEnumerable<T> 转换为 IEnumerable<KeyValuePair> (C#)

c# - 如何深度复制强类型集合的成员

c# - 如何识别通用声明类型?

C# & SQL Server 查询错误 : The multi-part identifier cannot be bound

c# - 表示日期和时间的最少字节数是多少?

c# - 字段的实际性能与属性

c# - 使用 Crystal 报表导出为pdf文件

c# - 将所有传出网络流量设置为通过某个代理