泛型委托的扩展方法

时间:2011-06-28 12:15:09

标签: c# delegates extension-methods

我正在重构一些使用具有out参数的方法的代码。我并不特别反对参数,但对于我正在做的事情,我很少需要超过一个值。

我有六个方法具有相同的签名“void GetThings(T thing,out x,out y)”

所以我想简单地说“gotY = NewMethod(T thing)”

我想出了这个。要遵循的问题:

    [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;
    }
}

现在我有点受伤了。一方面它是一个相当优雅的解决方案,另一方面,如果您之前没有看过这种风格,它并不完全直观。

所以在我再次撕掉它并做其他事情之前你有什么想法?您将如何解决上述重构问题?我的第三个选择是返回一个带有所有out参数设置属性的有效负载类。它可能比我上面所做的更清楚,但感觉不那么有趣?...

是的,我是那个一直说“Clarity胜过简洁”的人:/

1 个答案:

答案 0 :(得分:2)

个人而言,我认为它更清楚地做了类似于你所做的事情,但避免使用扩展方法。这样做的好处是您不需要将方法分配给显式委托引用,虽然它不那么有趣,但我个人觉得它更容易阅读:

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);