目前我正在将一些旧代码移植到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!");
//...
}
答案 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
这对我来说足够接近,但如果有人有更好的东西。让我知道。