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

C#特性

12

主题

12

帖子

36

积分

新手上路

Rank: 1

积分
36
目录

C#特性

1. 概括

C#中的特性是一种用于向代码元素添加元数据的机制。它们允许程序员在代码中添加额外的信息,以影响程序的行为、编译过程或提供其他元数据。特性在编写现代C#代码时变得越来越常见,因为它们提供了一种优雅的方法来实现元数据驱动的开发。
特性分为:框架自带特性(如:[Required]、[Authorize]、[Route]、[HttpPost]等)和自定义特性,都继承System.Attribute
2. 语法

定义特性类

以下是一个简单的特性类定义示例:
  1. using System;
  2. [AttributeUsage(AttributeTargets.Class | AttributeTargets.Method, AllowMultiple = true)]
  3. public class MyCustomAttribute : Attribute
  4. {
  5.     public string Description { get; }
  6.     public MyCustomAttribute(string description)
  7.     {
  8.         Description = description;
  9.     }
  10. }
复制代码
应用特性

将特性应用到代码元素上,可以使用以下语法:
  1.     [MyCustom("类使用自定义特性")]
  2.     public class MyClass
  3.     {
  4.         [MyCustom("方法使用自定义特性")]
  5.         public void MyMethod()
  6.         {
  7.         }
  8.     }
复制代码
获取特性

要获取 MyCustom 特性,您可以使用反射来检查某个类型或成员上是否应用了该特性,并且访问该特性的属性。下面是如何获取 MyCustom 特性的示例代码:
  1. // 获取 MyClass 类上的 MyCustom 特性
  2. var classAttributes = typeof(MyClass).GetCustomAttributes(typeof(MyCustomAttribute), false);
  3. foreach (MyCustomAttribute attribute in classAttributes)
  4. {
  5.     Console.WriteLine($"MyClass类使用的MyCustom特性: {attribute.Description}");
  6. }
  7. // 获取 MyClass 类中 MyMethod 方法上的 MyCustom 特性
  8. var methodInfo = typeof(MyClass).GetMethod("MyMethod");
  9. var methodAttributes = methodInfo.GetCustomAttributes(typeof(MyCustomAttribute), false);
  10. foreach (MyCustomAttribute attribute in methodAttributes)
  11. {
  12.     Console.WriteLine($"MyMethod方法使用的MyCustom特性: {attribute.Description}");
  13. }
复制代码
3. 应用场景

数据验证

在模型类上应用特性,以进行数据验证。例如,使用DataAnnotations中的特性来验证模型:
  1. public class User
  2. {
  3.     [Required]
  4.     [StringLength(50)]
  5.     public string Name { get; set; }
  6.     [Range(18, 99)]
  7.     public int Age { get; set; }
  8. }
复制代码
序列化和反序列化

控制对象的序列化和反序列化过程。例如,使用Json.NET中的特性来指定JSON属性的名称和行为:
  1. public class Product
  2. {
  3.     [JsonProperty("product_name")]
  4.     public string Name { get; set; }
  5.     [JsonIgnore]
  6.     public decimal Price { get; set; }
  7. }
复制代码
描述性元数据

为枚举值或其他代码元素添加描述信息。例如,使用DescriptionAttribute为枚举值添加描述信息:
  1. public enum Status
  2. {
  3.     [Description("The task is pending")]
  4.     Pending,
  5.     [Description("The task is completed")]
  6.     Completed
  7. }
复制代码
依赖注入

在依赖注入容器中标记服务以进行注入。例如,在ASP.NET Core中,使用[Inject]特性标记需要注入的服务:
  1. [Inject]
  2. public class MyService
  3. {
  4.     // This property will be injected by the DI container
  5. }
复制代码
单元测试

在单元测试框架中使用特性标记测试方法。例如,在NUnit中使用[Test]特性标记测试方法:
  1. [Test]
  2. public void TestMethod()
  3. {
  4.     // Test code here
  5. }
复制代码
权限控制

使用特性进行权限控制。例如,在ASP.NET Core中使用[Authorize]特性标记需要授权的控制器或操作方法:
  1. [Authorize(Roles = "Admin")]
  2. public class AdminController : Controller
  3. {
  4.     // Only accessible to users in the Admin role
  5. }
复制代码
AOP(面向切面编程)

通过特性实现AOP,如日志记录、事务管理等。例如,在ASP.NET Core中使用ActionFilterAttribute来实现日志记录:
  1. public class LogActionFilter : ActionFilterAttribute
  2. {
  3.     public override void OnActionExecuting(ActionExecutingContext context)
  4.     {
  5.         // Log action execution start
  6.         base.OnActionExecuting(context);
  7.     }
  8.     public override void OnActionExecuted(ActionExecutedContext context)
  9.     {
  10.         // Log action execution end
  11.         base.OnActionExecuted(context);
  12.     }
  13. }
复制代码
总结

C#中的特性为程序员提供了一种强大的元数据驱动机制,可以应用于多种场景。通过在代码中定义和使用特性,可以增强代码的可读性、可维护性,并提供灵活的方式来控制程序的行为和属性。
引用


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

举报 回复 使用道具