随着 C# 11 的发布,泛型属性(Generic Attributes)被引入到了语言中。在此之前,C# 中的属性不能有泛型类型参数,这在需要类型特定信息的某些场景中限制了它们的使用。这个新特性为开发者打开了编写更可重用、类型安全代码的大门。
泛型属性可以用于多种场景,包括但不限于:
以下是一些使用泛型属性的示例,以及如何在 C# 11 中运行测试。
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}");
}
}
}
在这个示例中,我们定义了一个泛型属性 ColumnMappingAttribute
,它允许我们为不同类型的字段指定列名和默认值。然后我们在 User
类中应用这个属性,并在 Main
方法中使用反射来遍历 User
类的属性,并打印出每个属性的映射信息和默认值。
本文作者:技术老小子
本文链接:
版权声明:本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!