通过Reflection获取当前的班级成员

时间:2014-05-08 12:12:14

标签: c# .net-assembly system.reflection

假设这段代码:

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; }
    }
}

你有什么建议?

谢谢。

2 个答案:

答案 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);

请注意,每个查询都包含InstancePublicNonPublic,因为文档说明了以下内容:

  

您必须指定实例静态以及公开非公开不会有任何成员返回

答案 1 :(得分:1)

我想你想要DeclaredOnly绑定标志