2017-01-23 22 views
1

これは以前のバージョンの.NETで使用されていました。 .netの中核用語では何が同等であるか。今、私は、次の取得エラー:コントローラの.NetコアからActionExecutingContext経由でカスタム属性を取得

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

答えて

3

希望他人を助けるために、ここに私がやったことだ:

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

別のオプションは、実行時のキャストなくても:ActionFilterAttributeから継承して

public class MyAttribute : Microsoft.AspNetCore.Mvc.Filters.ActionFilterAttribute { 
    // same content as in the question 
} 

を、あなたの属性は今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 
    } 
} 

キャストよりも汚れていないか汚れているかどうかはわかりませんが、属性を制御するとオプションになります。

関連する問題