Как получить объект MethodBase для метода? - PullRequest
8 голосов
/ 28 июля 2011

Я пытаюсь работать с классом, найденным в этом сообщении , но для его запуска требуется MethodBase.

Я прочитал Какой самый быстрый способ получить объект MethodBase? но я не смог заставить работать какое-либо решение.

Что мне нужно сделать, это получить объект MethodBase из функции.

Например, получить MethodBase для статическогоФункция WriteLine () класса Console или получение MethodBase для нестатической функции Add () из List <>.

Спасибо за помощь!

1 Ответ

14 голосов
/ 28 июля 2011

Метод 1

Вы можете использовать отражение напрямую:

MethodBase writeLine = typeof(Console).GetMethod(
    "WriteLine", // Name of the method
    BindingFlags.Static | BindingFlags.Public, // We want a public static method
    null,
    new[] { typeof(string), typeof(object[]) }, // WriteLine(string, object[]),
    null
);

В случае Console.Writeline () существует много перегрузок для этого метода. Вам нужно будет использовать дополнительные параметры GetMethod, чтобы получить правильный.

Если метод является универсальным и вы статически не знаете аргумент типа, вам нужно извлечь MethodInfo для метода open, а затем параметризовать его:

// No need for the other parameters of GetMethod because there
// is only one Add method on IList<T>
MethodBase listAddGeneric = typeof(IList<>).GetMethod("Add");

// listAddGeneric cannot be invoked because we did not specify T
// Let's do that now:
MethodBase listAddInt = listAddGeneric.MakeGenericMethod(typeof(int));
// Now we have a reference to IList<int>.Add

Метод 2

Некоторые сторонние библиотеки могут помочь вам в этом. Используя SixPack.Reflection , вы можете сделать следующее:

MethodBase writeLine = MethodReference.Get(
    // Actual argument values of WriteLine are ignored.
    // They are needed only to resolve the overload
    () => Console.WriteLine("", null)
);
...