如何确定Action是否已在C#7中捕获值

时间:2017-10-09 09:39:34

标签: c# lambda

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

(handler.Method.IsStatic == true)

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

所以我需要以另一种方式找出Action是否捕获了一些值,以便移植以下代码。

void add<U>(U target, Action<U> handler)
{
     var hasHandlerCapturedSomething=!handler.Method.IsStatic;
     if(hasHandlerCapturedSomething)throw new Exception("Only static handlers are allowed!");
    //...
}

1 个答案:

答案 0 :(得分:0)

我最接近的。如下。

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);
}

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

class Foo{
   int i;
   void bar(){}
}

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

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