C# 特性
本章将介绍 C# 中的特性(Attributes),它用于为代码元素添加元数据。
特性概述
什么是特性?
特性是一种声明性信息,用于为程序集、类型、成员等添加元数据。特性可以被反射读取,用于控制行为或提供额外信息。
// 使用特性
[Obsolete("请使用新方法")]
public void OldMethod() { }
内置特性
常用特性
// 标记方法已过时
[Obsolete("请使用 NewMethod 代替")]
public void OldMethod() { }
// 序列化
[Serializable]
public class Person { }
// 让代码可以序列化
[NonSerialized]
public string Cache;
// 条件编译
[Conditional("DEBUG")]
void DebugLog() { }
自定义特性
// 定义特性
[AttributeUsage(AttributeTargets.Class | AttributeTargets.Method)]
public class MyAttribute : Attribute
{
public string Description { get; }
public int Version { get; }
public MyAttribute(string description, int version = 1)
{
Description = description;
Version = version;
}
}
// 使用特性
[MyAttribute("用户类", version = 2)]
class User
{
[MyAttribute("获取用户名称")]
public string Name { get; set; }
}
特性应用场景
依赖注入
[AttributeUsage(AttributeTargets.Property | AttributeTargets.Field)]
public class InjectAttribute : Attribute { }
class Container
{
public void Inject(object obj)
{
var type = obj.GetType();
foreach (var prop in type.GetProperties())
{
if (prop.IsDefined(typeof(InjectAttribute)))
{
var serviceType = prop.PropertyType;
var instance = Activator.CreateInstance(serviceType);
prop.SetValue(obj, instance);
}
}
}
}
模型验证
[AttributeUsage(AttributeTargets.Property)]
public class RangeAttribute : Attribute
{
public int Min { get; }
public int Max { get; }
public RangeAttribute(int min, int max)
{
Min = min;
Max = max;
}
}
class User
{
[Range(0, 150)]
public int Age { get; set; }
}
小结
- 特性:为代码添加元数据
- 内置特性:Obsolete、Serializable、Conditional 等
- 自定义特性:创建自己的特性类
- 使用场景:依赖注入、验证、日志等
练习
- 创建自定义特性
- 使用反射读取特性信息
- 实现简单的属性验证机制