假设这段代码:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Reflection;
namespace TestFunctionality
{
class Program
{
static void Main(string[] args)
{
// System.Reflection.Assembly.GetExecutingAssembly().Location
Assembly assembly = Assembly.LoadFrom("c:\\testclass.dll");
AppDomain.CurrentDomain.Load(assembly.GetName());
var alltypes = assembly.GetTypes();
foreach (var t in alltypes)
{
Console.WriteLine(t.Name);
var methods = t.GetMethods(/*BindingFlags.DeclaredOnly*/);
foreach (var method in methods)
Console.WriteLine(
"\t--> "
+(method.IsPublic? "public ":"")
+ (method.IsPrivate ? "private" : "")
+ (method.IsStatic ? "static " : "")
+ method.ReturnType + " " + method.Name);
}
Console.ReadKey();
}
}
}
我试图获得在这个类中定义的方法的定义,但是从基类中不是。即,我不想得到像
这样的东西System.String ToString() // A method in the base class object.
如何过滤掉它们?
我试图通过BindingFlags.DeclaredOnly
,但过滤了所有内容。
这是在 testclass.dll :
namespace TestClass
{
public class Class1
{
public static int StaticMember(int a) { return a; }
private void privateMember() { }
private static void privateStaticMember() { }
public void PublicMember() { }
public void PublicMember2(int a) { }
public int PublicMember(int a) { return a; }
}
}
你有什么建议?
谢谢。
答案 0 :(得分:20)
你想要这个:
cl.GetMethods(BindingFlags.DeclaredOnly |
BindingFlags.Instance |
BindingFlags.Public);
根据MSDN documentation,它指出DeclaredOnly
:
指定只应考虑在提供的类型层次结构级别声明的成员。不考虑继承的成员。
现在,也许您明确要求不 public
的方法:
cl.GetMethods(BindingFlags.DeclaredOnly |
BindingFlags.Instance |
BindingFlags.NonPublic);
如果您想要 public
和非public
方法,请执行以下操作:
cl.GetMethods(BindingFlags.DeclaredOnly |
BindingFlags.Instance |
BindingFlags.Public |
BindingFlags.NonPublic);
请注意,每个查询都包含Instance
和Public
或NonPublic
,因为文档说明了以下内容:
您必须指定实例或静态以及公开或非公开或不会有任何成员返回强>
答案 1 :(得分:1)
我想你想要DeclaredOnly
绑定标志