C# Attribute 介绍

C# 中的 Attribute (特性)

Attribute 是 C# 中用于向代码元素(类、方法、属性、字段、事件等)附加元数据信息的机制。Attribute 不会直接影响代码的执行逻辑,但可以用于标记信息,并在运行时或编译时通过反射进行查询和处理。它们常被用于:

  • 控制序列化行为
  • 指定数据库映射信息
  • 提供文档注释
  • 控制程序元数据

Attribute 的基本结构

所有的特性类都继承自 System.Attribute,并且可以应用于代码元素中。特性可以通过 [AttributeName] 的方式使用。

Attribute 的创建与使用

1. 创建自定义 Attribute

要创建一个自定义的 Attribute,您需要继承自 System.Attribute 并添加构造函数及属性。可以通过 [AttributeUsage] 来指定特性的适用范围。

csharp 复制代码
using System;

// 定义自定义特性
[AttributeUsage(AttributeTargets.Class | AttributeTargets.Method, AllowMultiple = true)]
public class DeveloperInfoAttribute : Attribute
{
    public string DeveloperName { get; }
    public string Project { get; set; }
    public string DateAssigned { get; set; }

    // 构造函数
    public DeveloperInfoAttribute(string developerName)
    {
        DeveloperName = developerName;
    }
}
2. 应用自定义 Attribute

接下来可以在类或方法上应用这个自定义的 DeveloperInfo 特性:

csharp 复制代码
[DeveloperInfo("Alice", Project = "CRM System", DateAssigned = "2023-01-10")]
[DeveloperInfo("Bob", Project = "ERP System", DateAssigned = "2023-05-20")]
public class SampleClass
{
    [DeveloperInfo("Charlie", Project = "Mobile App", DateAssigned = "2024-02-15")]
    public void SampleMethod()
    {
        Console.WriteLine("This is a sample method.");
    }
}
3. 通过反射读取 Attribute 信息

可以使用反射来读取代码中的特性信息:

csharp 复制代码
using System;
using System.Reflection;

public class Program
{
    public static void Main()
    {
        // 获取类上的特性
        Type type = typeof(SampleClass);
        object[] classAttributes = type.GetCustomAttributes(typeof(DeveloperInfoAttribute), false);

        foreach (DeveloperInfoAttribute attr in classAttributes)
        {
            Console.WriteLine($"Class Developer: {attr.DeveloperName}, Project: {attr.Project}, Date Assigned: {attr.DateAssigned}");
        }

        // 获取方法上的特性
        MethodInfo methodInfo = type.GetMethod("SampleMethod");
        object[] methodAttributes = methodInfo.GetCustomAttributes(typeof(DeveloperInfoAttribute), false);

        foreach (DeveloperInfoAttribute attr in methodAttributes)
        {
            Console.WriteLine($"Method Developer: {attr.DeveloperName}, Project: {attr.Project}, Date Assigned: {attr.DateAssigned}");
        }
    }
}

运行结果

csharp 复制代码
Class Developer: Alice, Project: CRM System, Date Assigned: 2023-01-10
Class Developer: Bob, Project: ERP System, Date Assigned: 2023-05-20
Method Developer: Charlie, Project: Mobile App, Date Assigned: 2024-02-15

常用内置 Attribute

  • [Obsolete]: 标记某个方法或类已经过时,可以指定警告或错误。
  • [Serializable]: 标记类可以被序列化。
  • [DllImport]: 用于调用外部的非托管代码(P/Invoke)。
  • [Conditional]: 指示某个方法的执行受条件编译符的控制。
示例:[Obsolete]
csharp 复制代码
public class MyClass
{
    [Obsolete("Use NewMethod instead.")]
    public void OldMethod()
    {
        Console.WriteLine("Old method");
    }

    public void NewMethod()
    {
        Console.WriteLine("New method");
    }
}

当调用 OldMethod 时,编译器会发出警告:

csharp 复制代码
MyClass obj = new MyClass();
obj.OldMethod();  // 警告:'OldMethod' is obsolete: 'Use NewMethod instead.'

Attribute 的参数

特性的构造函数参数可以是以下几种类型:

  • 基本类型:如 int, string, bool, char 等。
  • 枚举类型。
  • Type 类型。
  • object,可以允许 null。
  • 一维数组(基本类型、枚举或 Type)。

Attribute 的高级用法

  1. 允许多次使用的特性 通过 AttributeUsage 设置 AllowMultiple = true,可以让特性在同一个代码元素上多次使用。
  2. 继承和覆盖特性 子类可以继承父类的特性,且特性可以设置是否支持继承。

总结

Attribute 是 C# 中一种强大的元数据机制,允许开发者在编译时和运行时动态地控制代码行为。通过特性,您可以轻松地向代码添加元数据,并通过反射进行处理。

相关推荐
AllData公司负责人2 小时前
AI大模型数据开发底座系列说明书,AllData集成Chat2DB开源项目建设AI 数据库分析底座,涵盖AI 洞察/对话SQL/智能视图!
数据库·人工智能·sql·开源·ai 洞察·对话sql
xixingzhe23 小时前
数据库备份的分类与特点
数据库
无奈笑天下3 小时前
银河麒麟上nproc命令教程详解
linux·运维·服务器
时间的拾荒人6 小时前
Redis 主从复制详解:配置实操 + 原理机制
数据库·redis·面试
火云代理6 小时前
更换网络后为什么会退出登录?分清 IP、Cookie 与会话的关系
服务器·网络·网络协议·tcp/ip·php·ip
隔窗听雨眠6 小时前
MySQL三表JOIN执行内核与优化器决策机制
数据库·mysql·sql优化
威嵌神州7 小时前
嵌入式排故实录:高并发下串口数据“超时丢包”的根因剖析与架构优化
运维·服务器·嵌入式硬件·缓存
Decay__7 小时前
SQLServer 索引与 SQL 优化 —— 聚集索引、非聚集索引、覆盖索引、碎片维护与执行计划
运维·数据库·sql·mysql·架构
笃行3509 小时前
【金仓数据库产品体验官】订单增量同步实战:MERGE、OUTPUT 与 IDENTITY 的兼容验证
数据库
火云代理10 小时前
同一个网站,有的网络能打开、有的打不开?认识 IPv4 与 IPv6 的访问差异
服务器·网络·网络协议·tcp/ip·测试工具·php·状态模式