ASP.NET MVC:如何在 C# 中使用反射查找具有 [Authorize] 属性的控制器 (或如何构建动态站点。主菜单)

作者:编程家 分类: 编程代码 时间:2025-07-11

使用反射查找具有 [Authorize] 属性的控制器是在 ASP.NET MVC 中构建动态站点的重要一步。通过使用反射,我们可以检查控制器类的属性,并确定哪些控制器需要进行身份验证。在本文中,我们将探讨如何使用 C# 中的反射来实现这一目标,并提供一个简单的示例代码。

使用反射查找具有 [Authorize] 属性的控制器

在 ASP.NET MVC 中,我们可以使用 [Authorize] 属性来标记需要进行身份验证的控制器或控制器中的特定动作。然而,有时我们需要在运行时动态地确定哪些控制器需要进行身份验证。这就是使用反射的地方。

要查找具有 [Authorize] 属性的控制器,我们可以遍历应用程序域中所有的程序集,并检查每个程序集中的所有类型。我们将使用 System.Reflection 命名空间中的类来实现这一目标。

首先,我们需要获取当前应用程序域中的所有程序集。我们可以使用 Assembly 类的 GetExecutingAssembly 方法来获取当前正在执行的程序集,然后使用 GetReferencedAssemblies 方法获取所有引用的程序集。

csharp

Assembly[] assemblies = AppDomain.CurrentDomain.GetAssemblies();

接下来,我们遍历每个程序集,并获取每个程序集中的所有类型。我们使用 Assembly 类的 GetTypes 方法来实现这一目标。

csharp

foreach (Assembly assembly in assemblies)

{

Type[] types = assembly.GetTypes();

// 在这里检查类型的属性

}

在循环中,我们可以使用 Type 类的 GetCustomAttributes 方法来获取类型的所有自定义属性。我们将使用 typeof(Attribute) 来过滤出所有的属性。

csharp

foreach (Type type in types)

{

object[] attributes = type.GetCustomAttributes(typeof(Attribute), true);

// 在这里检查每个属性

}

最后,我们可以检查每个属性是否为 [Authorize] 属性,如果是,则该控制器需要进行身份验证。

csharp

foreach (object attribute in attributes)

{

if (attribute is AuthorizeAttribute)

{

// 这是一个需要进行身份验证的控制器

}

}

示例代码

下面是一个简单的示例代码,演示如何使用反射查找具有 [Authorize] 属性的控制器。

csharp

using System;

using System.Reflection;

using System.Web.Mvc;

namespace ReflectionExample

{

class Program

{

static void Main(string[] args)

{

Assembly[] assemblies = AppDomain.CurrentDomain.GetAssemblies();

foreach (Assembly assembly in assemblies)

{

Type[] types = assembly.GetTypes();

foreach (Type type in types)

{

object[] attributes = type.GetCustomAttributes(typeof(Attribute), true);

foreach (object attribute in attributes)

{

if (attribute is AuthorizeAttribute)

{

Console.WriteLine("Found authorized controller: " + type.Name);

}

}

}

}

}

}

}

在上面的示例中,我们遍历了当前应用程序域中的所有程序集和类型,并打印出具有 [Authorize] 属性的控制器的名称。

使用反射查找具有 [Authorize] 属性的控制器是构建动态站点的重要一步。通过使用 C# 中的反射,我们可以在运行时动态地确定哪些控制器需要进行身份验证。本文提供了一个简单的示例代码,演示了如何使用反射来实现这一目标。希望本文能帮助您理解如何在 ASP.NET MVC 中构建动态站点并使用反射来查找具有 [Authorize] 属性的控制器。