C# 通过ActionExecutingContext从controller.Net Core获取自定义属性

C# 通过ActionExecutingContext从controller.Net Core获取自定义属性,c#,.net,asp.net-core,C#,.net,Asp.net Core,这用于早期版本的.Net。在.net核心术语中,等价物是什么。现在我得到以下错误: “ActionDescriptor”不包含“GetCustomAttributes”的定义,并且找不到接受“ActionDescriptor”类型的第一个参数的扩展方法“GetCustomAttributes” public virtual void SetupMetadata(ActionExecutingContext filterContext) { var myAttr = filterConte

这用于早期版本的.Net。在.net核心术语中,等价物是什么。现在我得到以下错误:

“ActionDescriptor”不包含“GetCustomAttributes”的定义,并且找不到接受“ActionDescriptor”类型的第一个参数的扩展方法“GetCustomAttributes

public virtual void SetupMetadata(ActionExecutingContext filterContext)
{
    var myAttr = filterContext.ActionDescriptor.GetCustomAttributes(typeof(MyAttribute), false);
    if (myAttr.Length == 1)
        //do something
}
属性定义:

public class MyAttribute : Attribute
{
    private readonly string _parameter;

    public PageTitleAttribute(string parameter)
    {
        _parameter = parameter;
    }

    public string Parameter { get { return _parameter; } }
}
代码用法:

[MyAttribute("Attribute value is set here")]
public ActionResult About()
{
    ViewBag.Message = "Your application description page.";
    return View();
}

希望能帮助别人,以下是我所做的:

var attrib = (filterContext.ActionDescriptor as ControllerActionDescriptor).MethodInfo.GetCustomAttributes<MyAttribute>().FirstOrDefault();
var attrib=(filterContext.ActionDescriptor作为ControllerActionDescriptor.MethodInfo.GetCustomAttributes().FirstOrDefault();

无需运行时强制转换的另一个选项:

public class MyAttribute :  Microsoft.AspNetCore.Mvc.Filters.ActionFilterAttribute {
  // same content as in the question
}
通过继承
ActionFilterAttribute
,您的属性现在将显示在集合中,您可以搜索:

public virtual void SetupMetadata(ActionExecutingContext filterContext)
{
    var myAttr = filterContext.ActionDescriptor
        .FilterDescriptors
        .Where(x => x.Filter is MyAttribute)
        .ToArray();
    if (myAttr.Length == 1) {
        //do something
    }
}
我不确定这是否比强制转换到
ControllerActionDescriptor
更脏或更干净,但如果您控制属性,这是一个选项。

为什么不使用:

filterContext.ActionDescriptor.ControllerDescriptor.GetCustomAttributes(typeof(MyAttribute), false).Any()
对于ASP.NET Core 3+:

var filters=context.filters;
//然后像这样过滤它:
var filtered=filters.OfType();

更直接的方法是
bool isAttributeSet=filterContext.ActionDescriptor.FilterDescriptors.Any(fd=>fd.Filter是MyAttribute)