Методы расширения для общих делегатов - PullRequest
0 голосов
/ 28 июня 2011

Я рефакторинг некоторого кода, который использует методы, которые имеют параметры.Я не особо против параметров out, но для того, что я делаю, мне редко требуется более одного значения.

У меня полдюжины методов с одинаковой сигнатурой "void GetThings (T вещь,out x, out y) "

, поэтому я хотел получить простые способы сказать" gotY = NewMethod (T вещь) "

Я придумал это.Вопросы для следования:

    [TestFixture]
public class TestsBase
{
    [Test]
    public void Test1()
    {
        Del.ImaExtMethod(2);
        Del2.ImanotherExtMethod(2);
    }

    public static MyDel Del = TestTest;
    public static MyDel2<int> Del2 = TestTest;

    public static void TestTest(int input, out int output)
    {
        output = input * 2;
    }
}

public delegate void MyDel(int input, out int output);
public delegate void MyDel2<T>(T input, out T output);

public static class TestExts
{
    public static int ImaExtMethod(this MyDel del, int input)
    {
        int result;
        del(input, out result);
        return result;
    }

    public static T ImanotherExtMethod<T>(this MyDel2<T> del, T input)
    {
        T result;
        del(input, out result);
        return result;
    }
}

Теперь я немного разорван.С одной стороны, это довольно элегантное решение, с другой стороны, оно не совсем интуитивно понятно, если вы раньше не видели этот стиль.

Итак, прежде чем я снова разорву это и сделаю что-нибудь еще, что ты думаешь?Как бы вы справились с вышеуказанным рефакторингом?Третий вариант - вернуть класс полезной нагрузки со всеми параметрами настройки параметров.Это, вероятно, яснее, чем то, что я сделал выше, но чувствует себя менее ... забавно? ...

Да, я тот же человек, который продолжает говорить "Ясность бьет краткость": /

1 Ответ

2 голосов
/ 28 июня 2011

Лично я считаю более понятным делать то же самое, что вы сделали, но избегать использования методов расширения. Преимущество этого в том, что вам не нужно присваивать свой метод явной ссылке на делегат, и, хотя он менее интересен, лично я думаю, что его легче читать:

public delegate void SingleInDualOut<TIn, TOut, TOut2>(TIn input, out TOut out1, out TOut2 out2);

public static class DelegateHelper
{
    public static TOut FirstOutputParam<TIn, TOut, TOut2>(SingleInDualOut<TIn, TOut, TOut2> del, TIn input)
    {
        TOut out1;
        TOut2 out2;

        del(input, out out1, out out2);

        return out1;
    }

    public static TOut2 SecondOutputParam<TIn, TOut, TOut2>(SingleInDualOut<TIn, TOut, TOut2> del, TIn input)
    {
        TOut out1;
        TOut2 out2;

        del(input, out out1, out out2);

        return out2;
    }
}

public static class DelegateTest
{
    public static void TestMethod(int input, out int output1, out int output2)
    {
        output1 = input * 2;
        output2 = input * 3;
    }
}

тогда назовите это так:

DelegateHelper.FirstOutputParam<int, int, int>(DelegateTest.TestMethod, 1);
...