如何使用具有相同结果的不同 Func 参数重构多个扩展

本文关键字:参数 Func 重构 扩展 何使用 结果 | 更新日期: 2023-09-27 17:57:08

我是Func/Action/Predicate的新手,想知道重构代码的最佳方法是什么,因为我可能会有很多重复的代码。

我创建了 2 个采用 Func 参数的扩展方法(始终返回布尔值):

public static void MyExtension<T>(this T obj, Func<T, bool> predicate)
    {
        do
        {
            //function code
        } while (predicate(obj));
    }
    public static void MyExtension<T1, T2>(this T1 obj, T2 OtherObject, Func<T1, T2, bool> predicate)
    {
        do
        {
            //function code
        } while (predicate(obj, OtherObject));
    }

我想要的是只对 do/while 循环进行一次编码,因为我可能有很多函数只会生成不同的 Func,但都想运行相同的 do/while 循环。

我在想这样的事情,它接受任何 Func 参数并在每个循环上运行它。循环中的代码不关心传递到 Func 中的类型。

public static void DoLoop(Func predicate)
    {
        do
        {
            //function code
        } while (predicate);
    }

但这显然是行不通的。有谁知道如何解决这个问题,或者我做错了什么根本上的事情?

最终结果是我想像下面这样调用代码:

        var Obj = new MyObj();
        Obj.MyExtension((x) => x.Prop1.Contains("string"));
        var OtherObj = new MyObj();
        Obj.MyExtension(OtherObj, (x,y) => x.Prop1.Contains("string") && y.Prop1.Contains("other"));

谢谢。

如何使用具有相同结果的不同 Func 参数重构多个扩展

由于泛型方法在不同数量的泛型类型上参数化,因此需要保留所有函数签名,以便编译调用代码。但是,您可以将实现移动到通用帮助程序方法中以减少重复代码:

// This is your single implementation
private static void DoLoop(Func<bool> predicate) {
    do {
        //function code
    } while (predicate());
}
// These are the wrappers
public static void MyExtension<T>(this T obj, Func<T, bool> predicate) {
     DoLoop(() => predicate(obj));
}
public static void MyExtension<T1, T2>(this T1 obj, T2 OtherObject, Func<T1, T2, bool> predicate) {
     DoLoop(() => predicate(obj, OtherObject));
}

包装器构造无参数谓词,并将其传递给提供实现的私有DoLoop方法。