目前,我正在将一些旧代码移植到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
这对我来说足够近了,但是如果有人有更好的东西。让我知道。