如何将Prism框架下C#的Lambda单行代码拆分为独立代码段?
问题:拆分Prism中Lambda风格的InteractionRequest回调代码
我接手了一个基于Prism的C#应用,其中包含不少Lambda风格的回调代码,示例如下:
using Prism.Interactivity.InteractionRequest; ... public InteractionRequest<Confirmation> OwnObjectRequest { get; } = new InteractionRequest<Confirmation>(); ... OwnObjectRequest.Raise(confirmation, c => // Lambda回调 { Confirmation conf = (Confirmation)c; if (conf.Confirmed) { DoSomething(); } });
我希望采用更清晰的编码方式,将Lambda中的逻辑拆成单独的方法,但不知道方法的签名是什么、如何用它定义Action等。目前我的尝试如下:
public ... some_Method(...) { Confirmation conf = (Confirmation)c; if (conf.Confirmed) { DoSomething(); } } Action actionToPerform = new Action(some_Method); OwnObjectRequest.Raise(confirmation, actionToPerform);
请问正确的写法是什么?我认为拆分虽无技术优势,但能帮助我理解和维护这类代码。
解答
1. 明确回调方法的正确签名
InteractionRequest<Confirmation>.Raise方法的第二个参数是**Action<Confirmation>类型**的委托,这意味着目标方法需要满足:
- 返回值为
void - 接收一个
Confirmation类型的参数
所以方法的完整签名应该是:
private void HandleOwnObjectConfirmation(Confirmation c)
2. 优化方法内的逻辑
原Lambda里的(Confirmation)c强制转换是多余的,因为参数本身就是Confirmation类型,直接使用即可。
3. 完整的拆分后代码
using Prism.Interactivity.InteractionRequest; ... public InteractionRequest<Confirmation> OwnObjectRequest { get; } = new InteractionRequest<Confirmation>(); ... // 单独的回调处理方法 private void HandleOwnObjectConfirmation(Confirmation c) { if (c.Confirmed) { DoSomething(); } } // 调用Raise时直接传入方法名(C#会自动隐式转换为Action<Confirmation>) OwnObjectRequest.Raise(confirmation, HandleOwnObjectConfirmation); // 或者显式创建Action委托(可选,和上面效果一致) // Action<Confirmation> confirmationAction = HandleOwnObjectConfirmation; // OwnObjectRequest.Raise(confirmation, confirmationAction);
说明
- 不需要显式写
new Action<Confirmation>(HandleOwnObjectConfirmation),C#支持方法组隐式转换为匹配的委托类型,直接传方法名更简洁。 - 拆分后的代码逻辑和原Lambda完全等价,只是把回调逻辑抽离到了单独方法中,更利于阅读和维护。
内容的提问来源于stack exchange,提问作者Dominique
相关产品推荐
相关产品推荐

