跳到主要内容

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; }
}

小结

  1. 特性:为代码添加元数据
  2. 内置特性:Obsolete、Serializable、Conditional 等
  3. 自定义特性:创建自己的特性类
  4. 使用场景:依赖注入、验证、日志等

练习

  1. 创建自定义特性
  2. 使用反射读取特性信息
  3. 实现简单的属性验证机制