分支到其他方法时我可以简化这个委托调用吗?

问题描述 投票:0回答:1
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 方法.

c# delegates
1个回答
0
投票

如果我理解正确,您可以使用

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 },
};
© www.soinside.com 2019 - 2024. All rights reserved.