C#学习第18天:特性(Attributes)

什么是特性?


  • **定义:**特性是向程序中的元素(如类、方法、属性等)附加元数据的标签。这些元数据在运行时可通过反射获取。
  • **用途:**用于声明性编程,可以为程序提供额外的信息,而无需改变其逻辑。

特性的种类


规定特性

  • Obsolete:标记过时的代码,可以发出警告或错误。
cs 复制代码
public class OldClass
{
    [Obsolete("Use NewMethod instead.")]
    public void OldMethod() { }
}

class Program
{
    static void Main()
    {
        OldClass oc = new OldClass();
        oc.OldMethod(); // 编译器警告
    }
}
  • Serializable:标记类可以进行序列化。
cs 复制代码
[Serializable]
public class SerializableClass
{
    public int Id { get; set; }
    public string Name { get; set; }
}
  • DllImport:用于调用非托管代码。
cs 复制代码
using System.Runtime.InteropServices;

public class ExternalMethods
{
    [DllImport("user32.dll")]
    public static extern int MessageBox(IntPtr hWnd, String text, String caption, uint type);
}

class Program
{
    static void Main()
    {
        ExternalMethods.MessageBox(IntPtr.Zero, "Hello", "Title", 0);
    }
}

自定义特性

  • AttributeUsage指定特性可以应用的程序元素。
  • 自定义特性继承自System.Attribute。
  • 使用反射获取类型和方法上的自定义特性。
cs 复制代码
using System;

// 定义自定义特性类
[AttributeUsage(AttributeTargets.Class | AttributeTargets.Method)]
public class DeveloperAttribute : Attribute
{
    public string Name { get; }
    public string Level { get; set; }

    public DeveloperAttribute(string name)
    {
        Name = name;
    }
}

// 使用自定义特性
[Developer("Alice", Level = "Senior")]
public class MyClass
{
    [Developer("Bob", Level = "Junior")]
    public void DoWork() { }
}

class Program
{
    static void Main()
    {
        Type type = typeof(MyClass);

        foreach (var attr in type.GetCustomAttributes(false))
        {
            if (attr is DeveloperAttribute developerAttr)
            {
                Console.WriteLine($"Class Developer: {developerAttr.Name}, Level: {developerAttr.Level}");
            }
        }

        foreach (var method in type.GetMethods())
        {
            foreach (var attr in method.GetCustomAttributes(false))
            {
                if (attr is DeveloperAttribute developerAttr)
                {
                    Console.WriteLine($"Method {method.Name} Developer: {developerAttr.Name}, Level: {developerAttr.Level}");
                }
            }
        }
    }
}

使用场景


代码文档:

  • 使用特性自动生成代码文档并验证约定。

框架开发:

  • 在ORM中使用特性配置对象与数据库表的映射关系。

测试与验证:

  • 指定单元测试的运行条件或行为。

安全与权限:

  • 基于特性实现访问控制或功能授权。

通过理解和使用特性,您能够更好地扩展程序的功能,使得代码更具可读性和可维护性。如果有任何问题或需要进一步探讨,请随时告诉我!

相关推荐
zlinear数据采集卡14 分钟前
数据采集卡从入门到精通(9):分辨率与精度——16位卡不等于1/65536的精度
开发语言·数据库·fpga开发·开源·c#
全栈技术负责人16 分钟前
解密 MCP(Model Context Protocol):大模型时代的“Type-C”总线与三驾马车架构深度解析
开发语言·ai·架构
丰锋ff23 分钟前
1.7在Qt窗口中添加右键菜单
开发语言·qt
蒸蒸yyyyzwd24 分钟前
后端面经学习笔记
笔记·学习
Titan202440 分钟前
Linux网络学习:套接字、UDP的封装与应用
linux·服务器·开发语言·网络·c++
鸿芯微控科技1 小时前
压电点胶阀出胶量不稳定怎么排查?驱动波形、背压、点胶重量与Python分析
开发语言·python·压电点胶阀·精密点胶·点胶重量·流体控制
原野池予1 小时前
深入Java集合框架:HashMap源码解析(JDK 8)
java·开发语言
lucky_syq2 小时前
专栏目录与学习路线 | 48 篇正文导览
人工智能·学习
测试运维日常笔记2 小时前
VMware vSphere、ESXi 与 vCenter Server:核心概念与关系详解
java·开发语言
小心亦新2 小时前
STM32学习23--I2C-1
stm32·嵌入式硬件·学习