Как получить объект MethodBase для метода?

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

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

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

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

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

1 ответ

Решение

Способ 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)
);
Другие вопросы по тегам