如何简化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
相关产品推荐
相关产品推荐

