【问题标题】:How do i find declared methods only, when doing a runtime assembly load?在执行运行时程序集加载时,如何仅找到声明的方法?
【发布时间】:2011-01-27 08:34:39
【问题描述】:

我正在加载运行时程序集,但我不知道任何类或方法的名称。我不想列出我的程序集中的所有类及其声明的方法,而不是从 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 方法。

【问题讨论】:

    标签: c# .net reflection assemblies load


    【解决方案1】:

    我认为您正在寻找标志:

    BindingFlags.Instance | BindingFlags.Public | BindingFlags.DeclaredOnly
    

    您也可以输入BindingFlags.NonPublic,具体取决于您的要求。

    我还要指出,随着更深层次的继承层次结构,类型可以继承基类型的成员 System.Object。如果您想保留这些,但不保留最初在 object 上声明的那些,您可以:

    1. 删除BindingFlags.DeclaredOnly 调用的GetMethods 标志。
    2. 仅包含以下方法:

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

    当然,如果您对“已声明”方法的定义更复杂,您可能需要不同的过滤器。

    【讨论】:

    • 完美运行,谢谢!我之前尝试过同时使用 Public 和 DeclaredOnly ,但这不起作用。为什么我需要指定所有三个?
    • @Bildsoe:System.Reflection.BindingFlags 是一个标志枚举。当Instance 标志未设置时,GetMethods 不包含实例方法。
    • 好的,谢谢。我只是想,如果方法是上面提到的任何方法,它就会被包括在内。
    • @Bildsoe:是的,这有点不直观,不是吗 - Instance 用作包容性过滤器,但 DeclaredOnly 是排斥性的。
    • 是的,有一点。但当然,在阅读 MSDN 上的文档时,我可以看到这里有描述。
    猜你喜欢
    • 2011-09-09
    • 2012-08-02
    • 1970-01-01
    • 2012-02-07
    • 1970-01-01
    • 1970-01-01
    • 2010-11-16
    • 1970-01-01
    相关资源
    最近更新 更多