【发布时间】:2017-11-16 03:43:31
【问题描述】:
有没有办法使用反射来获取类中的私有静态方法,而无需在这些方法中定义任何本地函数?
例如,我有一个这样的类:
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();
【问题讨论】:
-
它返回的是正确的,过滤也是必须做的以及首选和标准的方式(在许多情况下我们不使用BindingFlags,只是去LINQ查询来过滤所需的成员)。
-
有不止一种方法可以做到这一点。古怪的名字是一种方式,但这是一个实现细节。当然,一种理想的方法是过滤掉由编译器生成的任何方法,而不是用户代码。使用 MethodInfo.GetCustomAttributes() 并过滤掉那些具有 [System.Runtime.CompilerServices.CompilerGeneratedAttribute]
标签: c# reflection c#-7.0