如何重构具有相同结果的不同 Func 参数的多个扩展
How to refactor multiple extensions with different Func parameters with same result
我是 Func/Action/Predicate 的新手,想知道重构代码的最佳方法是什么,因为我可能会有很多重复的代码。
我创建了 2 个带有 Func 参数的扩展方法(总是返回 bool):
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 参数并在每个循环中 运行s 它。循环中的代码不关心传递给 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"));
谢谢。
由于您的泛型方法是在不同数量的泛型类型上进行参数化的,因此您需要保留所有函数签名,以便调用代码能够编译。但是,您可以将实现移至通用辅助方法中以减少重复代码:
// 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));
}
Wrappers 构造无参数谓词,并将其传递给提供实现的私有 DoLoop
方法。
我是 Func/Action/Predicate 的新手,想知道重构代码的最佳方法是什么,因为我可能会有很多重复的代码。
我创建了 2 个带有 Func 参数的扩展方法(总是返回 bool):
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 参数并在每个循环中 运行s 它。循环中的代码不关心传递给 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"));
谢谢。
由于您的泛型方法是在不同数量的泛型类型上进行参数化的,因此您需要保留所有函数签名,以便调用代码能够编译。但是,您可以将实现移至通用辅助方法中以减少重复代码:
// 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));
}
Wrappers 构造无参数谓词,并将其传递给提供实现的私有 DoLoop
方法。