使用Reflection来获取排除C#7.0中本地函数的方法?

时间:2017-11-16 03:43:32

标签: 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(BindingFlags.Static|BindingFlags.NonPublic)
    .Select(m=>m.Name).ToList();

然后我结束了类似的事情:

FooMethod
<FooMethod>g__LocalFoo5_0

包含本地函数的粗糙编译器生成的名称。

到目前为止,我能够想到的最好的方法是添加一个可以过滤掉本地函数的Where子句,例如:

    var methods = typeof(Foo).GetMethods(BindingFlags.Static|BindingFlags.NonPublic)
        .Where(m=>!m.Name.Contains("<")
        .Select(m=>m.Name).ToList();

或:

    var methods = typeof(Foo).GetMethods(BindingFlags.Static|BindingFlags.NonPublic)
        .Where(m=>!m.Name.Contains("__")
        .Select(m=>m.Name).ToList();

1 个答案:

答案 0 :(得分:1)

怎么样:

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

结果:

"FooMethod"

IsAssembly财产摘要:

  

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