如何在C#扩展方法中传入不同方法以实现逻辑复用?
解决方案:通过委托动态传入转换方法
核心修正:使用委托替代硬编码方法
你之前的代码错误在于调用委托的方式——不需要再写v.XXXX(line),而是直接把v和line作为参数传给传入的委托。正确的扩展方法代码如下:
public static IMySpecialClass[]? MyMultipleFunction(this string[]? values, float line, Func<string, float, IMySpecialClass> conversionFunc) { if (values == null) return null; List<IMySpecialClass> resultList = []; foreach (var value in values) { // 直接用传入的委托处理当前string和line参数 resultList.Add(conversionFunc(value, line)); } return [.. resultList]; }
调用示例
假设你原本的XXXX是string类型的一个实例方法(比如CreateSpecialClass(float line)),调用时可以直接传入方法引用或者Lambda表达式:
// 示例字符串数组 string[] inputStrings = ["test1", "test2", "test3"]; float targetLine = 2.0f; // 方式1:Lambda表达式 var result1 = inputStrings.MyMultipleFunction(targetLine, (str, line) => str.CreateSpecialClass(line)); // 方式2:方法组(更简洁,当方法签名完全匹配委托时可用) var result2 = inputStrings.MyMultipleFunction(targetLine, string.CreateSpecialClass);
之前报错的原因解释
- 第一个错误:你写了
func(v.XXXX(line)),这相当于只给需要两个参数的Func<string, float, IMySpecialClass>传了一个IMySpecialClass类型的参数,编译器自然提示缺少第二个参数。 - 第二个错误:移除
float参数后,委托变成Func<string, IMySpecialClass>,但你还是传入了v.XXXX(line)(IMySpecialClass类型),参数类型不匹配导致报错。
动态反射实现(不推荐,仅供参考)
如果一定要用动态指定方法名的方式(而非委托),可以通过反射实现,但这种方式会丢失编译时类型检查,性能也更差:
public static IMySpecialClass[]? MyMultipleFunctionDynamic(this string[]? values, float line, string methodName) { if (values == null) return null; List<IMySpecialClass> resultList = []; // 获取string类型中匹配参数的方法 var targetMethod = typeof(string).GetMethod(methodName, new[] { typeof(float) }); if (targetMethod == null) throw new ArgumentException($"string类型中不存在名为 {methodName} 且参数为float的方法"); foreach (var value in values) { // 调用方法并转换为IMySpecialClass var instance = targetMethod.Invoke(value, new object[] { line }) as IMySpecialClass; if (instance != null) resultList.Add(instance); } return [.. resultList]; }
调用示例:
var result = inputStrings.MyMultipleFunctionDynamic(targetLine, "XXXX");
内容的提问来源于stack exchange,提问作者KeithViking
相关产品推荐
相关产品推荐

