You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.17 23:59:59