我正在重构一些使用具有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胜过简洁”的人:/
答案 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);