C# 在执行运行时程序集加载时,如何仅查找声明的方法?

C# 在执行运行时程序集加载时,如何仅查找声明的方法?,c#,.net,reflection,assemblies,load,C#,.net,Reflection,Assemblies,Load,我正在进行运行时程序集加载,但我不知道任何类或方法的名称。我不想列出程序集中的所有类及其声明的方法,而不是从System.Object继承的类 代码如下: string str = ""; Assembly assembly = Assembly.LoadFile(@"c:\components.dll"); foreach (Type type in assembly.GetTypes()) { if (type.IsClass == true) {

我正在进行运行时程序集加载,但我不知道任何类或方法的名称。我不想列出程序集中的所有类及其声明的方法,而不是从System.Object继承的类

代码如下:

string str = "";   
Assembly assembly = Assembly.LoadFile(@"c:\components.dll");    

foreach (Type type in assembly.GetTypes())
{
    if (type.IsClass == true)
    {    
        str += type.Name + "\n";    
        MethodInfo[] methodInfo = type.GetMethods(BindingFlags.DeclaredOnly);

        foreach (MethodInfo mi in methodInfo)
        {    
            str += "\t" + mi.Name + "\n";    
        }    
    }
}

MessageBox.Show(str);
这是components.dll:

public class component01
{    
    public string myName = "component01";
    public string getMyName()
    {
        return myName;
    }
}

public class component02
{    
    public string myName = "component02";

    public string getMyName()
    {
        return myName;
    }
}
结果是:

component01
component02

And if i remove the bindingflag:

component01
   getMyName
   ToString
   Equals
   GetHashcode
   GetType
component02
   getMyName
   ToString
   Equals
   GetHashcode
   GetType

我只想显示
getMyName
方法。

我想您正在查找标志:

BindingFlags.Instance | BindingFlags.Public | BindingFlags.DeclaredOnly
您可能需要输入BindingFlags.NonPublic,具体取决于您的需求

我还想指出,通过更深入的继承层次结构,类型可以从基本类型继承成员,而不是
System.Object
。如果您想保留这些,而不是最初在
对象上声明的,您可以:

  • 删除
    BindingFlags.DeclaredOnly
    标记,用于
    GetMethods
    调用
  • 仅包括以下方法:

    methodInfo.GetBaseDefinition().DeclaringType != typeof(object)
    

  • 当然,如果“已声明”方法的定义更为复杂,您可能需要使用不同的筛选器。

    非常有效,谢谢!我以前尝试过使用Public和DeclaredOnly,但都不起作用。为什么我需要指定这三个呢?@Bildsoe:
    System.Reflection.BindingFlags
    是一个标志枚举。当未设置
    实例
    标志时,
    GetMethods
    不包括实例方法。好的,谢谢。我只是想,如果该方法是所提到的任何一种方法,它都会被包含。@Bildsoe:是的,它有点不直观,不是吗?
    实例
    作为一个包含过滤器工作,但是
    DeclaredOnly
    是独占的。是的,有点。当然,当阅读MSDN上的文档时,我可以看到这里描述了它。