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

如何在C#中实现类似C++重载()运算符的可调用类型?

解决方案

在C#中无法直接重载()运算符,但可以通过自定义类+隐式转换到委托类型的方式,实现类似C++可调用对象的效果,同时能为类型添加任意属性,且无需显式调用Invoke方法。

核心实现思路

自定义类中封装业务逻辑方法,同时添加隐式转换运算符,将类实例自动转换为对应的Action或Func<...>委托类型。这样在使用时,就可以像调用普通函数/委托一样直接用()调用实例,同时能访问类的属性。

代码示例

// 带属性的可调用类
public class CalculationHandler
{
    // 自定义属性:标记当前计算的类型
    public string CalculationType { get; set; }

    // 内部执行计算的逻辑
    private int Calculate(int num1, int num2)
    {
        return CalculationType switch
        {
            "Add" => num1 + num2,
            "Multiply" => num1 * num2,
            _ => throw new InvalidOperationException("不支持的计算类型")
        };
    }

    // 隐式转换为Func<int, int, int>委托
    public static implicit operator Func<int, int, int>(CalculationHandler handler)
    {
        return handler.Calculate;
    }
}

// 使用示例
public static void Main()
{
    // 创建加法计算器实例,设置属性
    var adder = new CalculationHandler { CalculationType = "Add" };
    // 直接像函数一样调用,无需Invoke
    int sum = adder(5, 3);
    Console.WriteLine($"加法结果:{sum}");
    Console.WriteLine($"当前计算类型:{adder.CalculationType}");

    // 创建乘法计算器实例
    var multiplier = new CalculationHandler { CalculationType = "Multiply" };
    int product = multiplier(5, 3);
    Console.WriteLine($"乘法结果:{product}");
}

扩展说明

  • 可以根据业务需求,添加对应不同签名的隐式转换运算符(比如无返回值的Action、多参数的Func等),让同一个类支持多种调用方式。
  • 类中可以添加任意数量的属性、字段或辅助方法,完全满足带状态的可调用类型需求。
  • 若需要更灵活的调用逻辑,也可以在转换运算符中直接返回匿名方法,无需单独定义内部方法:
public static implicit operator Func<int, int, int>(CalculationHandler handler)
{
    return (a, b) => 
    {
        // 直接在此编写逻辑,可访问handler的属性
        return handler.CalculationType == "Add" ? a + b : a * b;
    };
}

内容的提问来源于stack exchange,提问作者Freddy Martinez Garcia

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.03 16:27:15