Как найти только объявленные методы при загрузке сборки во время выполнения? - PullRequest
8 голосов
/ 27 января 2011

Я выполняю загрузку сборки во время выполнения, но я не знаю имен каких-либо классов или методов. Я не хочу перечислять все классы в моей сборке с их объявленными методами, а не унаследованные от 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);

Это компоненты.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 метод.

1 Ответ

11 голосов
/ 27 января 2011

Я думаю, вы ищете флаги:

BindingFlags.Instance | BindingFlags.Public | BindingFlags.DeclaredOnly

Вы также можете указать BindingFlags.NonPublic, в зависимости от ваших требований.

Я бы также отметил, что при более глубоких иерархиях наследования типы могут наследовать элементы от базовых типов , отличных от System.Object. Если вы хотите сохранить их, но не те, которые были первоначально объявлены в object, вы можете:

  1. Снимите флаг BindingFlags.DeclaredOnly для вызова GetMethods.
  2. Включать только методы, для которых:

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

Конечно, вам может понадобиться другой фильтр, если ваше определение «объявленного» метода было более сложным.

...