首页 > 编程语言 >C#之特性

C#之特性

时间:2024-12-14 19:03:02浏览次数:7  
标签:false Description C# SampleMethod 特性 sample MyCustomAttribute

C#之特性

在C#中,特性(Attributes)是一种用于在运行时为程序元素(如类、方法、属性等)添加元数据的代码构造。特性提供了一种声明性的方式来描述代码,而无需直接修改代码本身。以下是如何在C#中使用特性的基本步骤和示例:

注意事项

  1. AttributeUsage:

    • AttributeTargets 指定特性可以应用于哪些元素(如类、方法、属性等)。
    • Inherited 指定特性是否可以被派生类继承(默认为 true)。
    • AllowMultiple 指定是否可以在同一元素上多次应用该特性(默认为 false)。
  2. 反射:

    • 使用 Type.GetCustomAttributesMemberInfo.GetCustomAttributes 方法来获取特性。
    • 特性通常用于在运行时提供额外的信息,因此与反射一起使用是常见的。
  3. 命名约定:

    • 按照惯例,特性类名以 Attribute 结尾,但在使用时可以省略这个后缀。

1. 定义特性

首先,你需要定义一个特性类。特性类继承自 System.Attribute 类。你可以使用 AttributeUsage 特性来指定你的特性可以应用于哪些程序元素。

using System;

[AttributeUsage(AttributeTargets.Class | AttributeTargets.Method, Inherited = false, AllowMultiple = false)]
public class MyCustomAttribute : Attribute
{
    public string Description { get; }

    public MyCustomAttribute(string description)
    {
        Description = description;
    }
}

2. 应用特性

然后,你可以将你的特性应用于类、方法或其他程序元素。

[MyCustomAttribute("This is a sample class")]
public class SampleClass
{
    [MyCustomAttribute("This is a sample method")]
    public void SampleMethod()
    {
        Console.WriteLine("Hello from SampleMethod!");
    }
}

3. 读取特性

在运行时,你可以使用反射来读取并处理这些特性。

using System;
using System.Reflection;

class Program
{
    static void Main()
    {
        // 获取 SampleClass 类型信息
        Type type = typeof(SampleClass);

        // 读取类的特性
        object[] classAttributes = type.GetCustomAttributes(typeof(MyCustomAttribute), false);
        foreach (MyCustomAttribute attr in classAttributes)
        {
            Console.WriteLine($"Class Description: {attr.Description}");
        }

        // 获取 SampleMethod 方法信息
        MethodInfo method = type.GetMethod("SampleMethod");

        // 读取方法的特性
        object[] methodAttributes = method.GetCustomAttributes(typeof(MyCustomAttribute), false);
        foreach (MyCustomAttribute attr in methodAttributes)
        {
            Console.WriteLine($"Method Description: {attr.Description}");
        }

        // 调用方法
        SampleClass sample = new SampleClass();
        sample.SampleMethod();
    }
}

输出

Class Description: This is a sample class
Method Description: This is a sample method
Hello from SampleMethod!

注意事项

  1. AttributeUsage:

    • AttributeTargets 指定特性可以应用于哪些元素(如类、方法、属性等)。
    • Inherited 指定特性是否可以被派生类继承(默认为 true)。
    • AllowMultiple 指定是否可以在同一元素上多次应用该特性(默认为 false)。
  2. 反射:

    • 使用 Type.GetCustomAttributesMemberInfo.GetCustomAttributes 方法来获取特性。
    • 特性通常用于在运行时提供额外的信息,因此与反射一起使用是常见的。
  3. 命名约定:

    • 按照惯例,特性类名以 Attribute 结尾,但在使用时可以省略这个后缀。

通过这些步骤,你可以在C#中定义、应用和读取特性,从而增强代码的灵活性和可维护性。

注意:特性也是

标签:false,Description,C#,SampleMethod,特性,sample,MyCustomAttribute
From: https://blog.csdn.net/qq_41375318/article/details/144457253

相关文章

  • USB RX LOOPBACK
    USB3.0RXLoopback回环测试详解什么是USB3.0RXLoopback回环测试?USB3.0RXLoopback回环测试是一种用于验证USB3.0设备接收端功能的测试方法。简单来说,就是将设备的接收端和发送端连接起来,形成一个闭环,然后向这个闭环中发送数据,观察接收端是否能够正确地接收到并处理这......
  • MATLAB基础应用精讲-【数模应用】基于人工势场算法机器人避障路径规划(附python、C++和
    目录前言算法原理问题引入人工场式法算法思想机器人路径规划分类算法步骤存在的问题数学模型 引力势场斥力势场合力势场全局规划与局部避障系统一、全局路径规划二、局部动态避障优缺点优点:缺点:知识拓展基于A*算法和人工势场法的移动机器人路径规划 1A*......
  • 【Elasticsearch】关键数据类型
    ......
  • arcgis中常用公式汇总04—自动生成标识码
    一般建库中标识码编号规则为:行政区代码(6位)+扩展码(4位)+顺序码(8位),如北京东城区的行政区代码为110101,那么标识码一般从110101000000000001开始往后递增。打开属性表,在BSM处“右键—字段计算器”,选择“python”,勾选代码块,输入代码(如下);也可以将代码存为*cal格式的文件,后面需要再次......
  • JC4001 – Distributed Systems
     SchoolofNaturalandComputingSciencesDepartmentofComputingScience2024–2025Programmingassignment–IndividuallyAssessed(noteamwork)Title:JC4001–DistributedSystemsNote:Thisassignmentaccountsfor30%ofyourtotalmarkofthecourse.......
  • cache
    如何理解组和路把一个cache分为平均分为几列就是几路;然后想象放在一起平铺,有几行就是有多少组;每组有多少cacheline,就是每组有多少列,就是多少路;如图:有5列,就是5路;有3行,就是3组;每组有5个cacheline;(5列)每路有3个cacheline;(cacheline总数/路)寻址:如何通过内存地址找到所在cache......
  • 数字IC前端学习笔记:脉动阵列的设计方法学(二)
    相关阅读数字IC前端_日晨难再的博客-CSDN博客https://blog.csdn.net/weixin_45791458/category_12173698.html?spm=1001.2014.3001.5482引言    脉动结构(也称为脉动阵列)表示一种有节奏地计算并通过系统传输数据的处理单元(PEs)网络。这些处理单元有规律地泵入泵出数......
  • USACO备考冲刺必刷题 | P1588 Catch That Cow S
    学习C++从娃娃抓起!记录下USACO(美国信息学奥赛)备考学习过程中的题目,记录每一个瞬间。附上汇总贴:USACO备考冲刺必刷题|汇总-CSDN博客【题目描述】FJ丢失了他的一头牛,他决定追回他的牛。已知FJ和牛在一条直线上,初始位置分别为 x 和 y,假定牛在原地不动。FJ的行走方式......
  • USACO备考冲刺必刷题 | P1596 Lake Counting S
    学习C++从娃娃抓起!记录下USACO(美国信息学奥赛)备考学习过程中的题目,记录每一个瞬间。附上汇总贴:USACO备考冲刺必刷题|汇总-CSDN博客【题目描述】由于近期的降雨,雨水汇集在农民约翰的田地不同的地方。我们用一个 N×M(1≤N≤100,1≤M≤100)的网格图表示。每个网格中有水(W......
  • springboot/springcloud通过feign调用时请求头加header参数
    在使用springcloud时需要跟踪同一请求的路径,所以需要把请求头沿着请求传递下去,由于使用的时feign,在此记录下找到的两个方法。方法1、直接加RequestHeader下面加粗部分,请求时设置@FeignClient(value="org-service")publicinterfaceOrgFeign{@RequestMapping(method=......