首页 > 解决方案 > C# 重构 - 如何传递可能有多个参数的泛型方法?

问题描述

我的业务对象类具有几种通常遵循该模式的方法:

例子:

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));

(...)

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

标签: c#genericsmethodsrefactoring

解决方案


我终于得到了这个可行的解决方案(感谢您的指导@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


推荐阅读