Имя участника-члена в качестве аргумента

luisNET спросил: 13 июня 2018 в 05:12 в: c#

Возможно ли передать только имя метода / функции (члена) без параметров? Что-то похожее на то, что делает Moq:

    Mock<Foo>fooMoq = new Mock<Foo>();
    fooMoq.Setup(f => f.DummyMethod(It.IsAny<string>()));

но, без It.IsAny ():

    Mock<Foo> fooMoq = new Mock<Foo>();
    fooMoq.Setup(f => f.DummyMethod);

Я не имею в виду в контексте Moq, но в целом. Спасибо.

Изменить : Я хочу получить имя члена, чтобы позднее перехватить вызовы этого метода. Вот почему мне не интересно знать, какие параметры будут переданы методу, я просто хочу знать, какие методы они хотят перехватить.


1 ответ

Есть решение
MistyK ответил: 13 июня 2018 в 06:30

Нет, вы не можете передать метод из экземпляра параметра лямбда. Самое близкое, что вы можете получить, это использовать преобразование группы методов. Однако вы не указали, что вы хотите достичь.

После редактирования OP:

Нет более простого способа сделать это, поэтому популярные фреймворки, такие как MOQ, требуют от вас передать все требуемые параметры. Один из распространенных способов сделать это - просто передать метод с только нулями (или значениями по умолчанию для типов значений) следующим образом:

fooMoq.Setup(f => f.DummyMethod(null,null,null));

Существует также еще один подход, который позволяет вам не передавать никаких параметров, но вы теряете проверку статического типа для типа метода, чтобы вы могли передавать там любое имя метода. Также чтение будет более проблематичным, потому что у вас будет только имя и тип метода, которые могут вызвать проблемы при чтении перегруженных функций.

public class Program
{
    public static void Main()
    {
       Setup<Test>(nameof(Test.DummyMethod));
    }    public static void Setup<T>(string methodName)
    {    }
}public class Test
{
    public void DummyMethod()
    {    }
}
luisNET ответил: 13 июня 2018 в 06:37
Конечно, проблема nameof теряет статическую проверку типа. Верно и то, что я не думал о перегруженных функциях ... В любом случае, я больше всего интересуюсь любопытством. Я считаю, что достичь этого невозможно (вот почему я спрашиваю :)).
MistyK ответил: 14 июня 2018 в 07:21
@luisNET, если он ответит на ваш вопрос, а затем отметьте его как ответ.

Дополнительное видео по вопросу: Имя участника-члена в качестве аргумента

Настоящие имена и возраст членов BTS

ДОМ 2. Настоящие ИМЕНА и ФАМИЛИИ участников

Как выучить участников BTS за 5 минут. Учим BTS