Предположим, у меня есть класс, как это, содержащий общий метод с из параметров:Как вы называете общий метод без параметров путем отражения?
public class C
{
public static void M<T>(IEnumerable<T> sequence, out T result)
{
Console.WriteLine("Test");
result = default(T);
}
}
От чтения ответы на несколько других вопросов (How to use reflection to call generic Method? и Reflection on a static overloaded method using an out parameter), я думал, что я мог бы быть в состоянии вызвать метод посредством отражения следующим образом:
// get the method
var types = new[] { typeof(IEnumerable<int>), typeof(int).MakeByRefType() };
MethodInfo mi = typeof(C).GetMethod(
"M", BindingFlags.Static, Type.DefaultBinder, types, null);
// convert it to a generic method
MethodInfo generic = mi.MakeGenericMethod(new[] { typeof(int) });
// call it
var parameters = new object[] { new[] { 1 }, null };
generic.Invoke(null, parameters);
Но mi
возвращается нуль. Я попытался использовать object
вместо int
в массиве types
, но это тоже не сработает.
Как я могу указать типы (необходимые для параметра out) для общего метода до вызов MakeGenericMethod
?
Есть ли у вашего реального класса перегрузки 'M'? Если нет, вы можете просто использовать вариант «GetMethod», где вам не нужно указывать типы параметров. Это не отвечает на вопрос, который вы задали. – hvd
В этом конкретном случае я смогу обойти его, не указывая любые типы и просто используя имя, как предлагалось @SLaks.Мне все еще интересно узнать, что такое синтаксис для указания массива типов шаблонов, или если это невозможно. –
Где я ошибался, я подумал, что необходимо передать массив типов, чтобы использовать параметры 'out' или' ref'. Это не так ... до тех пор, пока у вас есть правильный 'MethodInfo', вы можете передать ему массив параметров, и он установит значения. –