在 C# 中创建和使用适用于 ASP.NET Core 的自定义属性

作者:微信公众号:【架构师老卢】
8-28 15:56
12

概述:C# 中的属性是一项强大的功能,允许开发人员将元数据添加到其代码中。此元数据可用于控制各种组件的行为,从序列化到验证,而不会因重复的逻辑而使代码库变得混乱。虽然 .NET 提供了丰富的内置属性,但有时你需要更符合你的特定需求的属性。这就是自定义属性发挥作用的地方。在本文中,我们将探讨如何在 ASP.NET Core 应用程序中用 C# 创建和使用自定义属性,并展示它们的实际用例和优势。C# 中的属性是什么?特性是可以放置在类、方法、属性和其他代码元素上的特殊声明性标记。它们提供有关这些元素行为的其他信息。属性派生自基类。System.Attribute例如,该属性可用于标记不应再使用的方法:[

C# 中的属性是一项强大的功能,允许开发人员将元数据添加到其代码中。此元数据可用于控制各种组件的行为,从序列化到验证,而不会因重复的逻辑而使代码库变得混乱。虽然 .NET 提供了丰富的内置属性,但有时你需要更符合你的特定需求的属性。这就是自定义属性发挥作用的地方。

在本文中,我们将探讨如何在 ASP.NET Core 应用程序中用 C# 创建和使用自定义属性,并展示它们的实际用例和优势。

C# 中的属性是什么?

特性是可以放置在类、方法、属性和其他代码元素上的特殊声明性标记。它们提供有关这些元素行为的其他信息。属性派生自基类。System.Attribute

例如,该属性可用于标记不应再使用的方法:[Obsolete]

[Obsolete("This method is deprecated, use NewMethod instead.")]  
public void OldMethod()  
{  
    // ...  
}

为什么要创建自定义属性?

虽然内置属性涵盖许多场景,但自定义属性允许您封装适用于应用程序的特定逻辑。它们可以通过分离横切关注点(如日志记录、验证或授权)来帮助您创建更简洁、更易于维护的代码。

创建自定义属性

让我们创建一个自定义属性,该属性可用于标记需要日志记录的方法。此属性将允许我们集中日志记录逻辑,而不是将其分散到各种方法中。

  1. 定义自定义属性

要创建自定义属性,请定义一个继承自 的类。您可以向属性类添加属性或构造函数以接受参数。System.Attribute

[AttributeUsage(AttributeTargets.Method, Inherited = false, AllowMultiple = false)]  
public sealed class LogMethodExecutionAttribute : Attribute  
{  
    public string LogMessage { get; }  
  
    public LogMethodExecutionAttribute(string logMessage)  
    {  
        LogMessage = logMessage;  
    }  
}
  • 该属性用于定义如何使用您的自定义属性。在此示例中,指定该属性只能应用于方法。该属性设置为 时,将属性限制为每个方法仅使用一次。[AttributeUsage]AttributeTargets.MethodAllowMultiplefalse

2. 应用 Custom 属性

  • 定义属性后,您可以将其应用于 ASP.NET Core 应用程序中的方法。
public class SampleController : ControllerBase  
{  
    [LogMethodExecution("Executing Index method")]  
    public IActionResult Index()  
    {  
        // Method logic here  
        return Ok("Index executed");  
    }  
}

3. 在 ASP.NET Core 中读取自定义属性

要使用 custom 属性,您需要考虑该方法并根据属性的属性执行任何关联的逻辑。这通常使用反射来完成。

以下示例说明了如何根据您的自定义属性实现自动记录方法执行:ActionFilter

public class LogMethodExecutionFilter : IActionFilter  
{  
    public void OnActionExecuting(ActionExecutingContext context)  
    {  
        var method = context.ActionDescriptor.MethodInfo;  
        var logAttribute = method.GetCustomAttribute<LogMethodExecutionAttribute>();  
  
        if (logAttribute != null)  
        {  
            // Your logging logic here  
            Console.WriteLine($"Log: {logAttribute.LogMessage}");  
        }  
    }  
  
    public void OnActionExecuted(ActionExecutedContext context)  
    {  
        // Post-action logic  
    }  
}

然后,您可以全局注册此过滤器或将其应用于特定控制器或操作:

services.AddControllers(options =>  
{  
    options.Filters.Add<LogMethodExecutionFilter>();  
});

实际用例

自定义属性可用于多种方案,包括:

  • 日志记录:如前所述,您可以创建自定义属性以在粒度级别处理日志记录。
  • 验证:自定义属性可用于验证方法参数或属性。
  • 授权:您可以创建强制实施特定安全规则的自定义授权属性。
  • 缓存:使用自定义缓存属性标记方法以自动缓存响应。

C# 中的自定义属性是向代码添加可重用元数据和行为的有效方法。它们通过抽象横切关注点来允许更清晰、更易维护和灵活的代码。在 ASP.NET Core 应用程序中,您可以使用自定义属性来增强日志记录、验证、授权等。

阅读排行