2017-01-23 628 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更骯髒或更清潔,但是如果您控制該屬性,則它是一個選項。