c# - C# 重构 - 如何传递可能有多个参数的泛型方法?
问题描述
我的业务对象类具有几种通常遵循该模式的方法:
- 总是返回一个对象结果
- 测试一个布尔前置条件:IsAllowed(例如检查某人是否可以在给定的上下文(MyContext 枚举)中做某事(MyAction 枚举)。
- 如果测试通过,则执行某些操作(通常在数据库级别返回一个 Result 对象),否则返回 PermissionDenied() ,它返回一个 Result(一个简单的对象,其布尔结果集为 false 和其他属性,包括错误消息)。
例子:
protected MyContext Context;
protected MyAction Action;
public Result List1(int p1, int p2, int p3, object p4, string p5)
=> IsAllowed(MyContext.Page, MyAction.List) ? DB.List1(p1, p2, p3, p4, p5) : PermissionDenied();
public Result View2(int p1, int p2)
=> IsAllowed(this.Context, this.Action) ? DB.View2(p1, p2) : PermissionDenied();
public Result Edit3(int p1, string p2)
=> IsAllowed(MyContext.Document, MyAction.Edit) ? DB.Edit3(p1, p2) : PermissionDenied();
(...)
我想了解如何通过一种可以处理该授权条件的方法来改进和简化这种模式。我想像GrantDo()这样的东西,但是该方法如何处理/接收内部方法,这里表示为??? 什么
Public Result GrantDo(??? what, MyContext? ctx=null, MyAction? act=null){
if (IsAllowed(ctx == null ? this.Context : ctx, act == null ? this.Action : act))
return what();
else
return PermissionDenied();
}
这样,我想上述方法可以重写为:
public Result List1(int p1, int p2, int p3, object p4, string p5)
=> GrantDo(DB.List1(p1, p2, p3, p4, p5), MyContext.Page, MyAction.List);
public Result View2(int p1, int p2) => GrantDo(DB.View2(p1, p2));
(...)
感谢您的任何建议和想法。
解决方案
我终于得到了这个可行的解决方案(感谢您的指导@Alvin)。
public Result GrantDo(Func<Result> method, MyAction action, MyContext? context = null)
=> IsAllowed(context ?? Context, action) ? method() : PermissionDenied();
找到有关不同概念的更多信息:
Action是一个方法的委托(指针),它接受零个、一个或多个输入参数,但不返回任何内容。
Func是一个方法的委托(指针),它接受零个、一个或多个输入参数,并返回一个值(或引用)。
Predicate是一种特殊的 Func,通常用于比较。
推荐阅读
- java - 您可以将文本字段中的字节转换为字符串吗?
- android - 如果片段不可见,如何关闭片段
- javascript - getElementById 未正确设置文本
- javascript - TypeError:message.guild.channels.find 不是函数 discord.js
- mysql - 保持内部查询的顺序或根据内部查询数据集对结果进行排序
- javascript - 动态侧边栏错误路径无法重定向
- java - 在我的 JPanel 中绘制简单的矩形不起作用
- recaptcha - Google reCAPTCHA 的 remoteip 参数被忽略
- github - 我们如何让 GitHub 中的项目可见但没有人可以打开它?
- ios - 使用 OPUS 库解码音频数据但没有获得清晰的语音和拆分数组字节然后在 Objective-c iOS 中转换为短字节