Рефлексия получение заранее заданных методов

Рейтинг: 0Ответов: 1Опубликовано: 22.10.2014

Господа, подскажите, пожалуйста, по коду.

using System;
using System.Reflection;
class a
{
    public void K(int x)
    {
        Console.WriteLine(x);
    }
    public int K(int x, int y)
    {
        return x + y;
    }
    public void V(string s)
    {
        Console.WriteLine(s);
    }
}
class b
{
    static void Main()
    {
        MethodInfo[] Mi = typeof(a).GetMethods(BindingFlags.DeclaredOnly);
        foreach (MethodInfo m in Mi)
        {
            ParameterInfo[] Pi = m.GetParameters();
            if (Pi.Length == 1 && Pi[0].ParameterType.Name == typeof(int).Name)
            {
                object[] o = new object[1] { 4 };
                m.Invoke(new a(), o);
            }
            if (Pi.Length == 2 && Pi[1].ParameterType.Name == typeof(int).Name)
            {
                object[] o = new object[2] { 7, 19 };
                m.Invoke(new a(), o);
            }
            if (Pi[0].ParameterType.Name == typeof(string).Name)
            {
                object[] o = new object[1] { "Colbasa" };
                m.Invoke(new a(), o);
            }
        }
    }
}

Почему typeof(a).GetMethods(BindingFlags.DeclaredOnly); возвращает пустое значение? Но при этом если typeof(a).GetMethods(BindingFlags.DeclaredOnly | BindingFlags.Public | BindingFlags.Instance);, тогда все ок. Ведь, как мне кажется, наоборот, первый вариант более общий.
Спасибо.

Ответы

▲ 4

Чтобы получить просто все методы класса, нужно использовать GetMethods() (без параметров). В случае с методом GetMethods(BindingFlags) нужно указывать также и флаги, определяющие дополнительные параметры методов. В частности, хотите ли вы получить методы экземпляра (BindingFlags.Instance) или статические (BindingFlags.Static)