C# 通过ActionExecutingContext从controller.Net Core获取自定义属性
这用于早期版本的.Net。在.net核心术语中,等价物是什么。现在我得到以下错误: “ActionDescriptor”不包含“GetCustomAttributes”的定义,并且找不到接受“ActionDescriptor”类型的第一个参数的扩展方法“GetCustomAttributes”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
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)代码>