编辑
2025-09-19
C#
00

目录

定义Attribute
创建代理类
使用代理类
运行结果
结论

面向切面编程(Aspect-Oriented Programming,AOP)是一种编程范式,旨在将横切关注点(如日志、安全性、事务管理等)从业务逻辑中分离出来,以提高代码的模块化。在C#中,可以通过自定义属性(Attribute)和反射(Reflection)来实现AOP的功能。本文将通过一个简单的例子来展示如何使用C#的Attribute来完成AOP功能。

定义Attribute

首先,我们定义一个自定义的Attribute,用于标记需要AOP处理的方法。这里我们创建一个简单的日志记录Attribute作为例子:

C#
using System; [AttributeUsage(AttributeTargets.Method, AllowMultiple = false)] public class LogAttribute : Attribute { public string Message { get; set; } public LogAttribute(string message) { Message = message; } }

AttributeUsage属性定义了这个Attribute可以应用的目标(这里是方法),以及是否允许多次应用。

创建代理类

接下来,我们需要一个代理类来处理带有LogAttribute的方法调用。这里我们使用动态代理,借助反射来实现:

C#
using System; using System.Reflection; public class Proxy<T> { private T _instance; public Proxy(T instance) { _instance = instance; } public void Invoke(string methodName, params object[] args) { MethodInfo methodInfo = typeof(T).GetMethod(methodName); if (methodInfo == null) { throw new ArgumentException($"Method {methodName} not found."); } // 检查是否有LogAttribute var logAttribute = methodInfo.GetCustomAttribute<LogAttribute>(); if (logAttribute != null) { // 前置处理:打印日志 Console.WriteLine($"Before invoking: {logAttribute.Message}"); } // 调用实际方法 methodInfo.Invoke(_instance, args); if (logAttribute != null) { // 后置处理:打印日志 Console.WriteLine($"After invoking: {logAttribute.Message}"); } } }

使用代理类

现在我们已经有了自定义的Attribute和代理类,接下来是如何使用它们。首先,定义一个普通的类,并使用我们的LogAttribute来标记方法:

C#
public class TestClass { [Log("Executing method DoSomething")] public void DoSomething() { Console.WriteLine("Inside DoSomething method."); } }

然后,通过代理类来调用标记了LogAttribute的方法:

C#
class Program { static void Main(string[] args) { TestClass testObj = new TestClass(); Proxy<TestClass> proxy = new Proxy<TestClass>(testObj); // 通过代理调用方法 proxy.Invoke("DoSomething"); } }

运行结果

当你运行上述代码时,你将看到如下输出:

SQL
Before invoking: Executing method DoSomething Inside DoSomething method. After invoking: Executing method DoSomething

image.png

结论

通过上述例子,我们展示了如何使用C#中的Attribute和反射来实现AOP的基本功能。这种方式可以让我们将一些横切逻辑(如日志记录)从业务代码中分离出来,从而提高代码的可维护性和可重用性。当然,这只是实现AOP的一种方式,在实际项目中,还可以考虑使用现成的AOP框架,如PostSharp、Castle DynamicProxy等,来进一步简化开发。

本文作者:技术老小子

本文链接:

版权声明:本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!