【问题标题】:How to query ASP.NET MVC 5 application for class-level attributes如何在 ASP.NET MVC 5 应用程序中查询类级属性
【发布时间】:2017-09-24 11:00:38
【问题描述】:

在我的 MVC 5 控制器中,我经常放置一个类级别的自定义属性来管理用户访问权限,例如

[RoleAuthorize("CreditSlipLog")]
public class CreditLogCreditSumController : Controller
{

我想知道是否可以查询应用程序以列出我的应用程序中每个控制器类的现有属性(分布在多个区域)。

我知道如何编写 LINQ 查询,但我不知道要选择哪个对象。在伪代码中,我想像这样:

var list = (queryable list of areas, classes and their attributes)
           .Where(controller has "RoleAuthorize" custom filter)
           .Select(m=> new {
                       Area = m.Area,
                       Controller = m.ControllerName,
                       RoleAuthorizeValue = m.ControllerAttributeValue
                   }).ToList();

其中,“RoleAuthorizeValue”是[RoleAuthorize]的参数值

所以示例结果可能如下所示:

Area   | Controller                    | RoleAuthorizeValue
------------------------------------------------------------
Credit | CreditLogCreditSumController  | CreditSlipLog

我可以查询单个对象,还是查询会非常混乱?或者它甚至是可能的?虽然我可以手动执行此操作,但它是一个非常大的应用程序,并且仍会发生更改,这会使手动文档很快与应用程序中的任何更改不同步。

【问题讨论】:

  • 您的所有类型都将包含在程序集中。查看System.Reflection.Assembly.GetExecutingAssembly()

标签: c# asp.net-mvc linq asp.net-mvc-5


【解决方案1】:

您需要为此使用反射和类似于下面的查询。

var controllersByAreas = Assembly.GetAssembly(typeof(CreditLogCreditSumController))
    .GetTypes()
    .Where(type => type.IsClass
                    && type.IsSubclassOf(typeof(Controller))
                    && type.GetCustomAttributes(typeof(RoleAuthorize), false).Any())
    .GroupBy(x => x.Namespace);

除了搜索属性之外,您还可以考虑提取属性并检查其属性。然后可以对结果集进行分组并打印出来。

如果您的控制器区域属于特定命名空间,您也可以考虑按TypeNamespace 属性进行分组,请参阅更新的代码。

【讨论】:

  • 我不得不将typeof(RoleAuthorize) 更改为typeof(RoleAuthorizeAttribute),因为后者是类的名称。否则效果很好。
  • 很高兴它对您有所帮助,反射是完成代码结构报告和静态分析任务的方法。当涉及到方法和属性的实际主体时,它惨遭失败)),但这是另一回事。
猜你喜欢
  • 2020-04-24
  • 2018-11-15
  • 1970-01-01
  • 2017-08-06
  • 1970-01-01
  • 1970-01-01
  • 2017-12-28
  • 1970-01-01
  • 2015-02-09
相关资源
最近更新 更多