在C#7.0中,使用反射获取排除局部函数的方法?

在C#7.0中,使用反射获取排除局部函数的方法?,c#,reflection,c#-7.0,C#,Reflection,C# 7.0,有没有一种方法可以使用反射来获取类中的私有静态方法,而不获取这些方法中定义的任何局部函数 例如,我有一个这样的类: public class Foo { private static void FooMethod(){ void LocalFoo(){ // do local stuff } // do foo stuff } } var methods = typeof(Foo).GetMethods(Bi

有没有一种方法可以使用反射来获取类中的私有静态方法,而不获取这些方法中定义的任何局部函数

例如,我有一个这样的类:

public class Foo {
    private static void FooMethod(){
        void LocalFoo(){
           // do local stuff
        }
        // do foo stuff
    }
}
var methods = typeof(Foo).GetMethods(BindingFlags.Static|BindingFlags.NonPublic)
    .Select(m=>m.Name).ToList();
如果我使用反射来获取私有静态方法,如下所示:

public class Foo {
    private static void FooMethod(){
        void LocalFoo(){
           // do local stuff
        }
        // do foo stuff
    }
}
var methods = typeof(Foo).GetMethods(BindingFlags.Static|BindingFlags.NonPublic)
    .Select(m=>m.Name).ToList();
然后我会得到这样的结果:

FooMethod
<FooMethod>g__LocalFoo5_0
那么:

var methods = typeof(Foo).GetMethods(BindingFlags.Static | BindingFlags.NonPublic)
    .Where(x => !x.IsAssembly)
    .Select(x => x.Name)
    .ToList();
结果:

"FooMethod"
IsAssembly
属性摘要:

获取一个值,该值指示此方法或构造函数的潜在可见性 由System.Reflection.MethodAttributes.Assembly描述;即方法 或构造函数最多对同一程序集中的其他类型可见,并且 对于程序集外部的派生类型不可见


它返回的结果是正确的,过滤也是一种必须做的事情,也是一种首选的标准方式(在许多情况下,我们不使用BindingFlags,只使用LINQ查询来过滤所需的成员)。不可靠的名称是一种方式,但这是一个实现细节。当然,理想的方法是过滤掉编译器生成的任何方法,而不是用户代码。使用MethodInfo.GetCustomAttributes()并筛选出具有[System.Runtime.CompilerServices.CompilerGeneratedAttribute]的函数。这假设所有本地函数都是
内部的
,在您的示例中生成的类签名是
内部类Foo
内部类
中的函数怎么可能不是内部的呢?它可以是
私有的
,在这种情况下,
IsAssembly
将返回
false
。这就是为什么它是
**x、 程序集
。OP希望筛选
私有静态
函数中的本地函数。对于此类本地函数,
x.IsAssembly
将为
false
,因此
!x、 IsAssembly
将为
true
,因此它将包含在结果中。