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

如何简化C#委托调用分支逻辑?优化冗余代码实现

重构基于ChangeType枚举的委托分支逻辑

我编写了一段基于ChangeMetadata类的ChangeType枚举属性处理MyDelegate调用的分支逻辑,代码如下:

public MyDelegate HandleRemoteChange => (data) => DataSwitch.Invoke(data);

private Func<ChangeMetadata, Action<ChangeMetadata>> DataSwitch => (d) => d.ChangeType switch
{
    ChangeType.Foo => onFoo(d),
    ChangeType.Bar => onBar(d),
};

private Action<ChangeMetadata> onFoo(ChangeMetadata metadata) => (o) =>
{
    // do something
};

private Action<ChangeMetadata> onBar(ChangeMetadata metadata) => (o) =>
{
    // do something else
};

这段代码过于冗余,我希望重构onFoo和onBar方法——完全无法理解为何要定义这种同时接收参数又额外传入o的Action<T>匿名方法。此外也欢迎其他优化建议,比如MyDelegate要求返回void,与模式匹配(需用Action<T>)适配不佳,或许有更简便的方式将返回void的MyDelegate与普通void方法做模式匹配。

补充说明:
我已写出更简洁且无编译错误的版本,但想知道是否还能进一步简化。从MSDN文档借鉴的语法略显奇怪:

internal MyDelegate HandleRemoteChange (ChangeMetadata data) => data switch
{
    OverrideSetChange os => delegate{ onSourceOverrideSet(os); },  
    // OverrideSetChange os => (os) => onSourceOverrideSet(os) <- 无法运行
};

private void onSourceOverrideSet(OverrideSetChange data){}

Lambda在此处无法工作,我的理解是模式匹配会隐式转换为协变元数据类型,进而破坏签名,但匿名闭包可正常运行。

内容的提问来源于stack exchange,提问作者NWoodsman

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.11 16:02:46