我创建了一个自定义属性:
[AttributeUsage(AttributeTargets.Method| AttributeTargets.Class)]
public class ActionAttribute : ActionFilterAttribute
{
public int Id { get; set; }
public string Work { get; set; }
}
我的控制员:
[Area("Administrator")]
[Action(Id = 100, Work = "Test")]
public class HomeController : Controller
{
public IActionResult Index()
{
return View();
}
}
我的代码:我使用反射来查找当前程序集中的所有控制器
Assembly.GetEntryAssembly()
.GetTypes()
.AsEnumerable()
.Where(type => typeof(Controller).IsAssignableFrom(type))
.ToList()
.ForEach(d =>
{
// how to get ActionAttribute ?
});
是否可以实用地阅读所有ActionAttribute
?
答案 0 :(得分:15)
要从课程中获取属性,您可以执行以下操作:
typeof(youClass).GetCustomAttributes<YourAttribute>();
// or
// if you need only one attribute
typeof(youClass).GetCustomAttribute<YourAttribute>();
它将返回IEnumerable<YourAttribute>
。
因此,在您的代码中,它将类似于:
Assembly.GetEntryAssembly()
.GetTypes()
.AsEnumerable()
.Where(type => typeof(Controller).IsAssignableFrom(type))
.ToList()
.ForEach(d =>
{
var yourAttributes = d.GetCustomAttributes<YourAttribute>();
// do the stuff
});
修改强>
对于CoreCLR,您需要再调用一个方法,因为API已经改变了一点:
typeof(youClass).GetTypeInfo().GetCustomAttributes<YourAttribute>();