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
};
我已经有了这个分支逻辑来通过使用类
MyDelegate
的
enum ChangeType
属性来处理
ChangeMetadata
调用
我认为这是不必要的冗长。你能重构这段代码来修复 onFoo 和 onBar 吗,因为我不明白为什么我需要使用参数和以 o 作为参数的匿名方法定义这些
Action<T>
。任何其他清理工作将不胜感激。例如, MyDelegate
需要一个 void 类型,它不能顺利地与模式匹配配合(我必须使用 Action<T>
来代替),也许有一些更简单的方法可以将 void MyDelegate 模式匹配到简单的 void 方法.
如果我理解正确,您可以使用
Dictionary<ChangeType, MyDelegate>
来存储 ChangeType
值和要调用的方法之间的映射。
然后您只需访问字典即可选择正确的代表。
private Dictionary<ChangeType, MyDelegate> dict;
// note that this could return null! There are other ChangeType values than Foo and Bar!
public MyDelegate HandleRemoteChange => (data) => dict.GetValueOrDefault(data.ChangeType);
private void onFoo(ChangeMetadata metadata) {}
private void onBar(ChangeMetadata metadata) {}
// initialise dict in the constructor...
dict = new() {
{ ChangeType.Foo, onFoo },
{ ChangeType.Bar, onBar },
};