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

(handler.Method.IsStatic == true)


C#7不再是这种情况,在C#7中,所有局部函数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!");
    //...
}

最佳答案

我最近的。如下。

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


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

10-06 10:32