2017-01-23 627 views
1

这个用于用于处理早期版本的.Net。 .net核心术语中的等价物。现在我得到以下错误:通过控制器.Net核心的ActionExecutingContext获取自定义属性

“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(); 
} 

回答

3

希望能帮助别人,这是我做的:

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

,而不需要一个运行时投另一种选择:

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更肮脏或更清洁,但是如果您控制该属性,则它是一个选项。