use*_*375 9 .net c# asp.net-core
这曾经用于早期版本的 .Net。.net 核心术语中的等价物是什么。现在我收到以下错误:
“ActionDescriptor”不包含“ GetCustomAttributes ”的定义,并且找不到接受“ActionDescriptor”类型的第一个参数的扩展方法“ GetCustomAttributes ”
public virtual void SetupMetadata(ActionExecutingContext filterContext)
{
var myAttr = filterContext.ActionDescriptor.GetCustomAttributes(typeof(MyAttribute), false);
if (myAttr.Length == 1)
//do something
}
Run Code Online (Sandbox Code Playgroud)
属性定义:
public class MyAttribute : Attribute
{
private readonly string _parameter;
public PageTitleAttribute(string parameter)
{
_parameter = parameter;
}
public string Parameter { get { return _parameter; } }
}
Run Code Online (Sandbox Code Playgroud)
代码用法:
[MyAttribute("Attribute value is set here")]
public ActionResult About()
{
ViewBag.Message = "Your application description page.";
return View();
}
Run Code Online (Sandbox Code Playgroud)
use*_*375 13
希望能帮助别人,这是我所做的:
var attrib = (filterContext.ActionDescriptor as ControllerActionDescriptor).MethodInfo.GetCustomAttributes<MyAttribute>().FirstOrDefault();
Run Code Online (Sandbox Code Playgroud)
对于 ASP.NET Core 3+:
var filters = context.Filters;
// And filter it like this:
var filtered = filters.OfType<OurFilterType>();
Run Code Online (Sandbox Code Playgroud)
无需运行时强制转换的另一种选择:
public class MyAttribute : Microsoft.AspNetCore.Mvc.Filters.ActionFilterAttribute {
// same content as in the question
}
Run Code Online (Sandbox Code Playgroud)
通过继承自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
}
}
Run Code Online (Sandbox Code Playgroud)
我不确定这是否比强制转换更脏或更干净ControllerActionDescriptor,但如果您控制属性,它是一个选项。
| 归档时间: |
|
| 查看次数: |
7772 次 |
| 最近记录: |