[英]C# Refactoring - How to pass generic method with possibly multiple parameters?
我有几个方法的业务对象类,这些方法通常遵循以下模式:
例子:
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));
(...)
感谢您的任何建议和想法。
您只需要传递一个函数(
一个 Action
一个 Func),您就可以简化空检查:
public Result GrantDo(Func<Result> action, MyContext? ctx = null, MyAction? act = null) =>
IsAllowed(context ?? this.Context, act ?? this.Action)
? action()
: PermissionDenied();
我终于得到了这个可行的解决方案(感谢您的指导@Alvin)。
public Result GrantDo(Func<Result> method, MyAction action, MyContext? context = null)
=> IsAllowed(context ?? Context, action) ? method() : PermissionDenied();
找到有关不同概念的更多信息:
Action是一个方法的委托(指针),它接受零个、一个或多个输入参数,但不返回任何内容。
Func是一个方法的委托(指针),它接受零个、一个或多个输入参数,并返回一个值(或引用)。
Predicate是一种特殊的 Func,常用于比较。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.