Asp.net 如何获取项目中每个控制器操作的所有自定义属性

Asp.net 如何获取项目中每个控制器操作的所有自定义属性,asp.net,asp.net-mvc,.net-assembly,custom-attributes,Asp.net,Asp.net Mvc,.net Assembly,Custom Attributes,我已经获得了项目中所有控制器及其各自操作的列表。我现在正试图创建一个自定义属性,用于每个操作,我可以在其中设置属性,如操作描述,例如“This creates a user”。这似乎很好,但现在的问题是:如何检索每个操作的自定义属性 下面是所有控制器和操作的列表。我只需要获取名为AccessControl var-controlleractionlist=asm.GetTypes() .Where(type=>typeof(System.Web.Mvc.Controller).IsAssigna

我已经获得了项目中所有控制器及其各自操作的列表。我现在正试图创建一个自定义属性,用于每个操作,我可以在其中设置属性,如操作描述,例如“This creates a user”。这似乎很好,但现在的问题是:如何检索每个操作的自定义属性

下面是所有控制器和操作的列表。我只需要获取名为
AccessControl

var-controlleractionlist=asm.GetTypes()
.Where(type=>typeof(System.Web.Mvc.Controller).IsAssignableFrom(type))
.SelectMany(type=>type.GetMethods(BindingFlags.Instance | BindingFlags.DeclaredOnly | BindingFlags.Public))
.Where(m=>!m.GetCustomAttributes(typeof(System.Runtime.CompilerServices.CompilerGeneratedAttribute),true)。Any()
.Select(x=>new{Controller=x.DeclaringType.Name,Action=x.Name,CustomAttr=x.DeclaringType.GetCustomAttributes(typeof(AccessControl),false).Cast())
.OrderBy(x=>x.Controller).ThenBy(x=>x.Action.ToList();
典型控制器动作示例

[HttpGet]
[AccessControl(Description=“创建用户”)]
公共行动结果索引()
{
返回视图();
}
最后是我的自定义属性类

public类访问控制:authorized属性
{
公共字符串说明{get;set;}
}
谢谢你使用这个:

Expression<Action<YourController>> myAction = m => m.Index();
var method = ((MethodCallExpression)myAction.Body).Method;
var statusAttributes = method.GetCustomAttributes();
Expression myAction=m=>m.Index();
var method=((MethodCallExpression)myAction.Body);
var statusAttributes=method.GetCustomAttributes();
您可以从上述statusAttributes集合中获取所有服装属性

使用以下命令:

Expression<Action<YourController>> myAction = m => m.Index();
var method = ((MethodCallExpression)myAction.Body).Method;
var statusAttributes = method.GetCustomAttributes();
Expression myAction=m=>m.Index();
var method=((MethodCallExpression)myAction.Body);
var statusAttributes=method.GetCustomAttributes();
您可以从上述statusAttributes集合中获取所有服装属性

var-controlleractionlist=asm.GetTypes()
.Where(type=>typeof(System.Web.Mvc.Controller).IsAssignableFrom(type))
.SelectMany(type=>type.GetMethods(BindingFlags.Instance | BindingFlags.DeclaredOnly | BindingFlags.Public))
.Where(m=>m.GetCustomAttributes(typeof(AccessControl),true).Any())
.Select(x=>new{Controller=x.DeclaringType.Name,Action=x.Name,CustomAttr=x.GetCustomAttributes(typeof(AccessControl),false).Cast())
.OrderBy(x=>x.Controller).ThenBy(x=>x.Action.ToList();
var controlleractionlist=asm.GetTypes()
.Where(type=>typeof(System.Web.Mvc.Controller).IsAssignableFrom(type))
.SelectMany(type=>type.GetMethods(BindingFlags.Instance | BindingFlags.DeclaredOnly | BindingFlags.Public))
.Where(m=>m.GetCustomAttributes(typeof(AccessControl),true).Any())
.Select(x=>new{Controller=x.DeclaringType.Name,Action=x.Name,CustomAttr=x.GetCustomAttributes(typeof(AccessControl),false).Cast())
.OrderBy(x=>x.Controller).ThenBy(x=>x.Action.ToList();

如果要访问从父级继承的更多属性,请在GetCustomAttributes()中将true作为参数传递。我没有在控制器本身中运行此功能。它发生在一个不同的控制器中,我从中得到一个列表,其中列出了访问系统的所有控制器及其操作。现在,对于每个操作,我想访问自定义属性。无论是在迭代每个操作时,还是在获取控制器和操作列表时,这都不是正确的方法。您需要指定控制器名称,否则反射将无法识别此操作属于哪个控制器。具有相同名称的操作可能位于多个控制器中。您可以遍历每个控制器,并且可以访问每个控制器的操作。所以在行表达式myAction=m=>m.Index()中传递controllername;如果要访问从父级继承的更多属性,请在GetCustomAttributes()中将true作为参数传递。我没有在控制器本身中运行此功能。它发生在一个不同的控制器中,我从中得到一个列表,其中列出了访问系统的所有控制器及其操作。现在,对于每个操作,我想访问自定义属性。无论是在迭代每个操作时,还是在获取控制器和操作列表时,这都不是正确的方法。您需要指定控制器名称,否则反射将无法识别此操作属于哪个控制器。具有相同名称的操作可能位于多个控制器中。您可以遍历每个控制器,并且可以访问每个控制器的操作。所以在行表达式myAction=m=>m.Index()中传递controllername;