在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
,因此它将包含在结果中。