Приспособьте непараметрический делегат к 2 параметрам, используя лямбда-выражение - PullRequest
1 голос
/ 07 февраля 2011

Надеюсь, что это возможно: у меня есть такой делегат:

delegate bool X();

У меня есть, например, 10 методов, которые соответствуют этой подписи, но один принимает 2 параметра.Как я мог использовать один и тот же делегат для этого?Я не очень хорошо понимаю лямбда-выражения, но думаю, что это возможно.

Ответы [ 2 ]

1 голос
/ 07 февраля 2011

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

delegate bool ParameterlessToBool();                  // AKA: Func<bool>
delegate bool TwoParameterToBool(object a, object b); // AKA: Func<object, object, bool>

TwoParameterToBool objectsEqual = (a, b) => a.Equals(b);
object argument1 = 1;
object argument2 = 2;
ParameterlessToBool isEqual = () => objectsEqual(argument1, argument2);
bool result = isEqual(); // false

Сначала я объявил двух делегатов для использования в этом примере, ParameterlessToBool и TwoParameterToBool. Они эквивалентны делегатам каркаса Func<bool> и Func<object, object, bool> соответственно. Вы не обязаны это делать, просто у меня есть что поработать в примере.

Я использовал двухпараметрическую лямбду для инициализации переменной objectsEqual типа TwoParameterToBool. Он вызывает Equals() по двум параметрам и возвращает результат. Затем я инициализировал два аргумента, которые необходимы для возможности вызова этой новой функции. Затем использовали лямбду с нулевым параметром для инициализации isEqual переменной типа ParameterlessToBool. Он вызывает двухпараметрическую функцию с двумя аргументами, определенными ранее, и возвращает результат. Затем вызывается функция, чтобы показать, как она используется.

0 голосов
/ 07 февраля 2011

Почему бы вам просто не использовать oob делегатов?

  • Action<T>
  • Funct<Tresult>
  • Funct<Tin, Tresult>
  • Funct<Tin1, Tin2, Tresult>
  • ...

Например, следующий код может ответить на ваш вопрос (если я правильно понял):

    public void MethodWithNoArgNoReturn()
    {

    }

    public int MethodWithNoArgWithReturn()
    {
        return 42;
    }

    public void MethodWith1ArgNoReturn(int i)
    { }

    public int MethodWith2ArgsWithReturn(string s1, string s2)
    {
        return 42;
    }

    void test()
    {
        var a1 = new Action(MethodWithNoArgNoReturn);
        a1();

        var f1 = new Func<int>(MethodWithNoArgWithReturn);
        var i1 = f1();

        var a2 = new Action<int>(MethodWith1ArgNoReturn);
        a2(43);

        var f2 = new Func<string, string, int>(MethodWith2ArgsWithReturn);
        var i2 = f2("test", "test");
    }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...