Как вызвать с отражением метод, который принимает параметр Func‹›?

Когда я пытаюсь добавить параметр Func<> в массив MethodInfo.Invoke, он выдает ошибку, что не может преобразовать группу методов в объект.

Как мне справиться с этим?

Сигнатура метода:

static bool Something(Func<Expression, Expression, BinaryExpression> body)

Что я прохожу:

MethodInfo.Invoke(null, new object[] { Expression.Subtract }); // compilation error

CS0428 Не удается преобразовать группу методов «Вычитание» в тип «объект», не являющийся делегатом. Вы намеревались вызвать метод?


person SpiritBob    schedule 04.02.2021    source источник
comment
@Sweeper Надеюсь, это поможет.   -  person SpiritBob    schedule 04.02.2021
comment
Я добавил правильное сообщение об ошибке и дополнительные исследования. Должно быть хорошо... или странно... не уверен. Не стесняйтесь вернуться. Но объясните, что неясно в сообщении об ошибке...   -  person Alexei Levenkov    schedule 04.02.2021


Ответы (1)


Действительно, преобразования групп методов в object не происходит, но есть преобразования групп методов в совместимые типы делегатов (преобразования групп методов), а также преобразования типов делегатов в object. Таким образом, вы можете сначала преобразовать группу методов в Func<Expression, Expression, BinaryExpression> с помощью приведения, затем ее можно неявно преобразовать в object:

someMethodInfo.Invoke(null, new object[] { (Func<Expression, Expression, BinaryExpression>)Expression.Subtract });
person Sweeper    schedule 04.02.2021
comment
@SpiritBob Или, другими словами, C # понятия не имеет, какой тип делегата вы хотите создать, обычно он делает это. - person Charlieface; 04.02.2021