繁体   English   中英

C# 重构 - 如何传递可能有多个参数的泛型方法?

[英]C# Refactoring - How to pass generic method with possibly multiple parameters?

我有几个方法的业务对象类,这些方法通常遵循以下模式:

  • 总是返回一个对象结果
  • 测试布尔前置条件: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));

(...)

感谢您的任何建议和想法。

您只需要传递一个函数( 一个 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,常用于比较。

来源: Func vs. Action vs. Predicate

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM