一种链接全局方法和记录结果的优雅方法

时间:2010-12-30 02:33:15

标签: c# design-patterns refactoring extension-methods

想象一下,我有一组与任何特定类无关的全局方法。每个方法只需要一个对象,并且只返回一个不同类型的对象。

我希望能够将这些方法链接在一起,以便一个方法返回的对象作为参数传递给下一个方法,依此类推。 扩展方法是我能想到的最容易和最优雅的方法:

var result = someObj.ExtensionMethod1().ExtensionMethod2().ExtensionMethod3();

但是,我还有一个log方法,它接受一个object参数,我希望将每个方法的结果传递给这个log方法。例如:

var result1 = someObj.ExtensionMethod1();
log(result1);
var result2 = result1.ExtensionMethod2();
log(result2);
var result3 = result2.ExtensionMethod3();
log(result3);

有没有更优雅的方法这样做,所以每次调用方法时都不需要创建临时变量?

1 个答案:

答案 0 :(得分:3)

您正在寻找

public static T Log<T>(this T thing) {
    ...
    return thing;
}

var result = someObj.ExtensionMethod1().Log()
                    .ExtensionMethod2().Log()
                    .ExtensionMethod3().Log();

(需要通用参数,以便可以在不进行强制转换的情况下使用返回值)

LINQPad的Dump()方法的工作方式相同。