首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >如何确定Action是否捕获了C# 7中的值

如何确定Action是否捕获了C# 7中的值
EN

Stack Overflow用户
提问于 2017-10-09 09:39:34
回答 1查看 78关注 0票数 2

目前,我正在将一些旧代码移植到C# 7。由于语言的改变,我遇到了问题。在C# 5中,不捕获任何内容的lambda是静态的:

代码语言:javascript
运行
复制
(handler.Method.IsStatic == true)

在C# 7中,不再是这种情况,所有本地函数lambdas .都是本地函数。

因此,我需要以另一种方式了解Action是否捕获了一些值,以移植以下代码。

代码语言:javascript
运行
复制
void add<U>(U target, Action<U> handler)
{
     var hasHandlerCapturedSomething=!handler.Method.IsStatic;
     if(hasHandlerCapturedSomething)throw new Exception("Only static handlers are allowed!");
    //...
}
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2018-04-11 15:18:17

我最近的一次。如下所示。

代码语言:javascript
运行
复制
static bool hasCapturedValues(Action a) { return isStatic(a.Method); }
static bool hasCapturedValues(System.Reflection.MethodInfo methodInfo)
{
    var fields = methodInfo.DeclaringType.GetFields(BindingFlags.Public |
                    BindingFlags.NonPublic |
                    BindingFlags.Static |
                    BindingFlags.Instance |
                    BindingFlags.DeclaredOnly).ToList();
    return methodInfo.IsStatic|| fields.All(f=>f.IsStatic);
}

唯一不起作用的是下面的场景

代码语言:javascript
运行
复制
class Foo{
   int i;
   void bar(){}
}

var foo=new Foo();
Action barAction=foo.bar;
Console.WriteLine(hasCapturedValues(barAction)); //print true

这对我来说已经够近了,但如果有人有更好的东西。让我知道。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/46643304

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档