这用于与早期版本的.Net一起使用。什么是.net核心术语中的等价物。现在我得到以下错误:
'ActionDescriptor'不包含' GetCustomAttributes '的定义,并且没有扩展方法' GetCustomAttributes '接受第一个类型为'ActionDescriptor'的参数可以找到
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();
}
答案 0 :(得分:3)
希望能帮助别人,这就是我的所作所为:
var attrib = (filterContext.ActionDescriptor as ControllerActionDescriptor).MethodInfo.GetCustomAttributes<MyAttribute>().FirstOrDefault();
答案 1 :(得分:3)
另一个不需要运行时强制转换的选项:
public class MyAttribute : Microsoft.AspNetCore.Mvc.Filters.ActionFilterAttribute {
// same content as in the question
}
通过继承ActionFilterAttribute
,您的属性现在会显示在ActionDescriptor.FilterDescriptors集合中,您可以搜索:
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
更脏或更干净,但如果你控制属性,这是一个选项。
答案 2 :(得分:2)
对于ASP.NET Core 3 +:
var filters = context.Filters;
// And filter it like this:
var filtered = filters.OfType<OurFilterType>();
答案 3 :(得分:1)
为什么不使用:
filterContext.ActionDescriptor.ControllerDescriptor.GetCustomAttributes(typeof(MyAttribute), false).Any()