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

Bil*_*soe 8 .net c# reflection load assemblies

我正在进行运行时程序集加载,但我不知道任何类或方法的名称.我不想用我们声明的方法列出我的程序集中的所有类,而不是从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);
Run Code Online (Sandbox Code Playgroud)

这是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;
    }
}
Run Code Online (Sandbox Code Playgroud)

结果:

component01
component02

And if i remove the bindingflag:

component01
   getMyName
   ToString
   Equals
   GetHashcode
   GetType
component02
   getMyName
   ToString
   Equals
   GetHashcode
   GetType
Run Code Online (Sandbox Code Playgroud)

我只想要显示的getMyName方法.

Ani*_*Ani 11

我想你正在寻找旗帜:

BindingFlags.Instance | BindingFlags.Public | BindingFlags.DeclaredOnly
Run Code Online (Sandbox Code Playgroud)

您也可以BindingFlags.NonPublic根据自己的要求加入.

我还要指出,对于更深层次的继承层次结构,类型可以从除基类之外的 基类继承成员System.Object.如果你想保留那些,而不是最初声明的那些object,你可以:

  1. 删除呼叫的 BindingFlags.DeclaredOnly标志GetMethods.
  2. 仅包括以下方法:

    methodInfo.GetBaseDefinition().DeclaringType != typeof(object)
    
    Run Code Online (Sandbox Code Playgroud)

当然,如果"声明"方法的定义更复杂,则可能需要使用不同的过滤器.