编辑
2025-09-29
C#
00

目录

中的属性不能有泛型类型参数,这在需要类型特定信息的某些场景中限制了它们的使用。这个新特性为开发者打开了编写更可重用、类型安全代码的大门。
应用场景
特点
示例
示例 1: 数据注解泛型属性

随着 C# 11 的发布,泛型属性(Generic Attributes)被引入到了语言中。在此之前,C# 中的属性不能有泛型类型参数,这在需要类型特定信息的某些场景中限制了它们的使用。这个新特性为开发者打开了编写更可重用、类型安全代码的大门。

应用场景

泛型属性可以用于多种场景,包括但不限于:

  • 数据注解:增强模型属性的元数据描述,例如为数据库模型指定列名和默认值。
  • 配置系统:在配置系统中,泛型属性可以用于标识特定类型的配置选项。
  • 依赖注入:标注需要注入的服务类型,提高依赖注入的类型安全性。
  • 插件和扩展系统:定义插件的元数据,如类型、版本等。
  • 自定义序列化/反序列化:在序列化和反序列化过程中,泛型属性可以提供类型特定的指令。

特点

  • 类型安全:泛型属性提供了类型参数,使得属性的使用更加安全,减少了类型转换错误的可能性。
  • 可重用性:泛型属性可以在不同类型之间重用,提高了代码的可重用性。
  • 灵活性:泛型属性可以根据不同的类型参数进行调整,提供了更大的灵活性。

示例

以下是一些使用泛型属性的示例,以及如何在 C# 11 中运行测试。

示例 1: 数据注解泛型属性

C#
using System; // 定义一个泛型属性来标注字段或属性应该如何映射到数据库列 [AttributeUsage(AttributeTargets.Property)] public class ColumnMappingAttribute<T> : Attribute { public string ColumnName { get; } public T DefaultValue { get; } public ColumnMappingAttribute(string columnName, T defaultValue) { ColumnName = columnName; DefaultValue = defaultValue; } } // 使用泛型属性来标注模型 public class User { [ColumnMapping<String>("username", "anonymous")] public string Username { get; set; } [ColumnMapping<int>("age", 18)] public int Age { get; set; } } // 测试代码 static void Main(string[] args) { var user = new User(); Type userType = typeof(User); foreach (PropertyInfo prop in userType.GetProperties()) { var mappingAttribute = prop.GetCustomAttribute(typeof(ColumnMappingAttribute<>), false); if (mappingAttribute != null) { // 这里我们需要使用反射来获取泛型属性的值 // 由于泛型属性是一个新特性,具体的反射方法可能需要根据实际实现来调整 // 下面的代码是一个示例,可能并不适用于最终的实现 var column = mappingAttribute.GetType().GetProperty("ColumnName").GetValue(mappingAttribute); var defaultValue = mappingAttribute.GetType().GetProperty("DefaultValue").GetValue(mappingAttribute); Console.WriteLine($"{prop.Name} maps to column {column} with default value {defaultValue}"); } } }

image.png

在这个示例中,我们定义了一个泛型属性 ColumnMappingAttribute,它允许我们为不同类型的字段指定列名和默认值。然后我们在 User 类中应用这个属性,并在 Main 方法中使用反射来遍历 User 类的属性,并打印出每个属性的映射信息和默认值。

本文作者:技术老小子

本文链接:

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