编程语言
首页 > 编程语言> > c# – 如何获取自定义属性在执行时附加到的函数/操作名称?

c# – 如何获取自定义属性在执行时附加到的函数/操作名称?

作者:互联网

理想情况下,我想创建一个继承自ActionFilterAttribute的过滤器,我可以将其应用于Global.asax,它将为我的应用程序中的所有操作创建性能计数器.这个问题很简单,但问题是我希望性能计数器在其名称中包含它们附加到的操作的方法签名.但是,我找不到一种方法来提取构造期间附加属性的方法的方法名称.这导致我必须单独将属性应用于每个操作,并将其签名作为参数传递.然而,这带来了明显的问题(即,方法签名的更新不会与perf计数器命名自动同步).

为了简化问题,如果我将属性附加到任何类型的方法,我可以访问它附加到的方法的名称/签名吗?我正在寻找适用于不是从ActionFilterAttribute派生的属性的通用解决方案.

public class SomeAttribute : ActionFilterAttribute
{
    public string FunctionSignature { get; set; }

    public SomeAttribute() 
    {
        this.FunctionName = { HOW DO I GET THE NAME OF THE METHOD I'M ON WITHOUT PASSING IT IN AS AN INPUT ARGUMENT? }
    }

    public override void OnActionExecuted(ActionExecutedContext filterContext)
    {
        // Some code to update perf counter(s) with recorded time that will use string.Format("{0}: Avg. Time or Something", this.FunctionSignature).
    }

    public override void OnActionExecuting(ActionExecutingContext filterContext) 
    {
        // Some code to record time.
    }
}

[SomeAttribute]
public void SomeMethod()
{
    // Some code.
}

解决方法:

找到执行操作的名称:

var actionName = filterContext.ActionDescriptor.ActionName;

或者

var actionName = filterContext.RouteData.Values["action"] as string

查找参数(Name,Type,DefaultValue):

var parameters = filterContext.ActionDescriptor.GetParameters();

查找参数值:

 var value= filterContext.ActionParameters["parameterName"]; 

标签:c,net,asp-net,asp-net-mvc,action-filter
来源: https://codeday.me/bug/20190611/1221666.html