【问题标题】:Anonymous method in static class is non-static? How to invoke it?静态类中的匿名方法是非静态的吗?如何调用它?
【发布时间】:2017-02-22 11:40:30
【问题描述】:

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

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,我也会遇到同样的问题。

我怎样才能得到这样的实例?

【问题讨论】:

  • 但是你的目标是什么?预期的结果是什么?

标签: c# .net reflection lambda


【解决方案1】:

请记住,这个 (lambdas) 是一个编译器功能,因此运行时框架版本不会产生影响。此外,因为这是一个编译器功能,所以 2012 年和 2015 年(当时引入 Roslyn 取代了大部分现有编译器基础架构)之间存在差异也就不足为奇了。

我无法给出明确的理由说明为什么会在此处对其进行专门更改(尽管我知道进行了一些更改以使 Edit-and-Continue 能够在更多情况下工作),但它从来都不是合同 关于如何实现 lambda。

我怎样才能得到这样的实例?

好吧,lambda 是一个 Delegate,并且它总是公开一个 Target 属性,当委托如此绑定时它引用一个实例。

【讨论】:

  • 就是这样,谢谢。根据您的回答,我在 Roslyn github 中找到了一些文档。这似乎是一种性能改进:roslyn.codeplex.com/workitem/246
【解决方案2】:

我怎样才能得到这样的实例

我不确定这是否重要?当然,您可以通过简单地执行此操作来运行 lambda 函数(例如)

Console.Print(lambda());

因此,它是否是静态的这一事实在很大程度上无关紧要。

【讨论】:

  • 我需要使用Expression.Call,我不能简单地调用它。
  • @Jens 够公平
猜你喜欢
  • 2017-04-30
  • 1970-01-01
  • 1970-01-01
  • 2011-01-17
  • 2017-03-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-03-20
相关资源
最近更新 更多