翼度科技»论坛 编程开发 .net 查看内容

C#中Attribute的魅力:从基础到高级AOP实战

5

主题

5

帖子

15

积分

新手上路

Rank: 1

积分
15
 
概述:C#中的Attribute(特性)为程序元素提供了灵活的元数据机制。除基础应用外,可高级应用于自定义代码生成、AOP等领域。通过示例展示了Attribute在AOP中的实际用途,以及如何通过反射机制获取并执行与Attribute相关的逻辑。
在C#中,Attribute(特性)是一种用于为程序实体(如类、方法、属性等)添加元数据的机制。它们提供了一种在运行时向程序元素添加信息的灵活方式。Attribute通常用于提供关于程序元素的附加信息,这些信息可以在运行时被反射(reflection)机制访问。
功用和作用:


  • 元数据添加: Attribute允许程序员向代码添加元数据,这些元数据提供关于程序元素的额外信息。
  • 运行时信息获取: 通过反射,可以在运行时检索Attribute,从而动态获取与程序元素相关的信息。
  • 代码分析: Attribute可以用于代码分析工具,使其能够更好地理解和处理代码。
应用场景:


  • 序列化: 在进行对象序列化时,可以使用Attribute指定序列化的方式。
  • ASP.NET MVC: 在MVC框架中,Attribute用于指定路由、行为等信息。
  • 单元测试: Attribute可用于标记测试方法,提供测试框架更多的信息。
  • 安全性: Attribute可以用于标记一些安全相关的信息,如权限控制。
提供方法及步骤:

下面通过一个简单的例子来演示在C#中使用Attribute的方法和步骤。我们将创建一个自定义Attribute,然后将其应用于一个类的属性上。
  1. using System;
  2. // 定义一个自定义Attribute
  3. [AttributeUsage(AttributeTargets.Property, Inherited = false, AllowMultiple = false)]
  4. sealed class MyCustomAttribute : Attribute
  5. {
  6.     public string Description { get; }
  7.     public MyCustomAttribute(string description)
  8.     {
  9.         Description = description;
  10.     }
  11. }
  12. // 应用Attribute的类
  13. class MyClass
  14. {
  15.     // 应用自定义Attribute到属性上
  16.     [MyCustomAttribute("This is a custom attribute.")]
  17.     public string MyProperty { get; set; }
  18. }
  19. class Program
  20. {
  21.     static void Main()
  22.     {
  23.         // 使用反射获取Attribute信息
  24.         var property = typeof(MyClass).GetProperty("MyProperty");
  25.         var attribute = (MyCustomAttribute)Attribute.GetCustomAttribute(property, typeof(MyCustomAttribute));
  26.         // 输出Attribute的信息
  27.         if (attribute != null)
  28.         {
  29.             Console.WriteLine($"Attribute Description: {attribute.Description}");
  30.         }
  31.         else
  32.         {
  33.             Console.WriteLine("Attribute not found.");
  34.         }
  35.     }
  36. }
复制代码
在这个例子中,我们创建了一个名为MyCustomAttribute的自定义Attribute,并将其应用于MyClass类的MyProperty属性。然后,在Main方法中,我们使用反射获取并输出Attribute的信息。
C#的Attribute可以用于更复杂的场景

例如:

  • 自定义代码生成: 通过在Attribute中添加代码生成的逻辑,可以在编译时生成额外的代码。这在某些框架中是常见的做法,比如ASP.NET MVC中的一些Attribute可以生成路由映射代码。
  • AOP(面向切面编程): Attribute可以用于实现AOP,通过在方法上添加Attribute来定义切面逻辑,如日志记录、性能监控等。
  • 自定义序列化/反序列化: 可以使用Attribute来定义对象序列化和反序列化的方式,以满足特定的需求。
  • ORM(对象关系映射): 一些ORM框架使用Attribute来映射类和数据库表之间的关系,以及属性和表字段之间的对应关系。
下面通过一个简单的例子来演示AOP的应用,其中使用Attribute实现一个简单的日志记录:
  1. using System;
  2. [AttributeUsage(AttributeTargets.Method, Inherited = false, AllowMultiple = false)]
  3. sealed class LogAttribute : Attribute
  4. {
  5.     public void BeforeCall()
  6.     {
  7.         Console.WriteLine("Method execution started at: " + DateTime.Now);
  8.     }
  9.     public void AfterCall()
  10.     {
  11.         Console.WriteLine("Method execution completed at: " + DateTime.Now);
  12.     }
  13. }
  14. class Example
  15. {
  16.     [Log]
  17.     public void MyMethod()
  18.     {
  19.         Console.WriteLine("Executing the method...");
  20.     }
  21. }
  22. class Program
  23. {
  24.     static void Main()
  25.     {
  26.         var example = new Example();
  27.         var method = typeof(Example).GetMethod("MyMethod");
  28.         // 使用反射获取Attribute并执行相应逻辑
  29.         var logAttribute = (LogAttribute)Attribute.GetCustomAttribute(method, typeof(LogAttribute));
  30.         if (logAttribute != null)
  31.         {
  32.             logAttribute.BeforeCall();
  33.         }
  34.         // 调用方法
  35.         example.MyMethod();
  36.         if (logAttribute != null)
  37.         {
  38.             logAttribute.AfterCall();
  39.         }
  40.     }
  41. }
复制代码
运行效果:
 
在这个例子中,我们定义了一个LogAttribute,它包含了在方法执行前后记录日志的逻辑。然后,我们在MyMethod方法上应用了这个Attribute。在Main方法中,使用反射获取Attribute并执行相应的逻辑,从而实现了在方法执行前后记录日志的功能。
这是一个简单的AOP例子,实际应用中可以根据需求定义更复杂的Attribute和逻辑。
源代码获取:https://pan.baidu.com/s/1OCKBCzTpgmI6Bdb_24M1BQ?pwd=6666 
 


来源:https://www.cnblogs.com/hanbing81868164/p/18072014
免责声明:由于采集信息均来自互联网,如果侵犯了您的权益,请联系我们【E-Mail:cb@itdo.tech】 我们会及时删除侵权内容,谢谢合作!

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

x

举报 回复 使用道具