c# 特性

发布时间:2026/7/13 4:57:09

c# 特性 在 C# 中特性Attributes是一种强大的机制允许你将元数据Metadata附加到代码元素如类、方法、属性、程序集等上。这些元数据可以在编译时或运行时被读取从而改变代码的行为或提供额外信息。以下是关于 C# 特性的核心概念、常用内置特性以及如何自定义特性的详细指南1. 核心概念定义特性是继承自System.Attribute类的类。语法在代码元素前使用方括号[]包裹。例如[Obsolete]。作用它们本身不执行逻辑而是作为“标签”。真正的逻辑由编译器如检查过时警告或运行时反射如序列化、ORM 映射、ASP.NET Core 路由来读取和处理。2. 常用的内置特性C# 提供了许多预定义的特性以下是开发中最常见的几类A. 编译器辅助类这些特性帮助编译器进行代码检查或生成警告。[Obsolete]: 标记某个成员已过时。[Obsolete(请使用 NewMethod() 代替, true)] // true 表示视为错误而非警告 public void OldMethod() { }[Conditional]: 条件编译。只有在定义了特定符号时调用该方法才会被编译。[Conditional(DEBUG)] public void LogDebug(string message) { }[CallerMemberName],[CallerLineNumber]: 自动获取调用者的成员名或行号常用于日志或通知。B. 运行时与框架类 (常用于 ASP.NET Core, Entity Framework 等)[Serializable]: 标记类可被序列化较旧的技术现代 .NET 常用System.Text.Json属性。[DllImport]: 用于调用非托管 DLL 中的函数 (P/Invoke)。ASP.NET Core 常用:[HttpGet],[HttpPost]: 定义 HTTP 动词。[Route(api/[controller]) ]: 定义路由模板。[Authorize]: 要求用户通过身份验证。[FromBody],[FromQuery]: 指定参数绑定来源。Entity Framework Core 常用:[Key]: 指定主键。[Table(Users)]: 指定映射的数据库表名。[NotMapped]: 指示该属性不映射到数据库列。3. 如何自定义特性你可以创建自己的特性来存储特定的元数据并通过反射 (Reflection)在运行时读取它。第一步定义特性类必须继承System.Attribute通常建议以Attribute结尾命名使用时可省略。using System; // 指定该特性可以应用在哪些目标类、方法、属性等 [AttributeUsage(AttributeTargets.Class | AttributeTargets.Method, AllowMultiple false)] public class MyCustomInfoAttribute : Attribute { public string Description { get; set; } public int Version { get; set; } // 构造函数 public MyCustomInfoAttribute(string description) { Description description; Version 1; } }第二步应用特性[MyCustomInfo(这是一个测试类, Version 2)] public class UserService { [MyCustomInfo(获取用户信息的方法)] public void GetUser(int id) { // ... } public void DeleteUser(int id) { // 没有应用特性 } }第三步通过反射读取特性using System; using System.Reflection; public class Program { public static void Main() { Type type typeof(UserService); // 获取类上的特性 var classAttr (MyCustomInfoAttribute)Attribute.GetCustomAttribute(type, typeof(MyCustomInfoAttribute)); if (classAttr ! null) { Console.WriteLine($类描述: {classAttr.Description}, 版本: {classAttr.Version}); } // 获取方法上的特性 MethodInfo method type.GetMethod(GetUser); var methodAttr (MyCustomInfoAttribute)Attribute.GetCustomAttribute(method, typeof(MyCustomInfoAttribute)); if (methodAttr ! null) { Console.WriteLine($方法描述: {methodAttr.Description}); } } }4. 关键知识点AttributeUsage在定义自定义特性时[AttributeUsage]非常重要它控制特性的行为参数说明ValidOn指定特性可以应用的目标如AttributeTargets.Class,AttributeTargets.Property等。AllowMultipletrue允许同一元素上应用多个该特性实例false(默认) 只允许一个。Inheritedtrue(默认) 表示派生类会继承基类上的特性false则不继承。5. 应用场景总结框架魔法ASP.NET Core 的路由、依赖注入、MVC 模型绑定全靠特性驱动。序列化/反序列化控制 JSON 或 XML 的字段名称、忽略某些字段如[JsonIgnore]。ORM 映射将 C# 类映射到数据库表结构如 EF Core, Dapper。测试框架xUnit/NUnit 使用[Fact],[Test],[Theory]来识别测试方法。文档生成工具扫描代码中的特性来自动生成 API 文档。依赖注入容器某些容器使用特性来自动注册服务。如果你需要针对某个具体场景如“如何在 ASP.NET Core 中写一个自定义授权特性”的代码示例请告诉我

相关新闻