每个.NET开发都应掌握的C sharp特性(Attribute)知识点

上篇文章讲述了C#反射知识点,本文将介绍C#特性(Attribute)的知识点。C#特性(Attribute)是一种强大的元数据机制,用于为代码元素(如类、方法、属性等)添加信息,以影响它们的行为或提供额外的信息。本文将介绍C#特性每个.NET开发都应熟悉的知识点,希望对大家开发有一定的帮助。

1、特性的基本概念

公共语言运行时使你能够添加类似于关键字的描述性声明(称为特性),以便批注编程元素(如类型、字段、方法和属性),它是以方括号([])的形式附加到代码元素上,并可包含参数。特性的定义通常是通过创建一个继承自System.Attribute的自定义类来实现的。下面是一个简单的特性定义示例,是.NET默认创建最小api的官方示例:

  [HttpGet(Name = "GetWeatherForecast")]//特性
  public IEnumerable<WeatherForecast> Get()
  {
      return Enumerable.Range(1, 5).Select(index => new WeatherForecast
      {
          Date = DateOnly.FromDateTime(DateTime.Now.AddDays(index)),
          TemperatureC = Random.Shared.Next(-20, 55),
          Summary = Summaries[Random.Shared.Next(Summaries.Length)]
      })
      .ToArray();
  }

以上特性是http的Get请求特性,对外的链接名称是GetWeatherForecast。

详解-->C#-特性(Attribute)

2、内置特性的示例

C#默认提供了一些内置特性,例如[Obsolete]、[Serializable]和[Conditional]等。这样以便.NET开发很方便处理基本特定的逻辑任务。

[Obsolete] 特性:[Obsolete]特性用于标记已过时的代码。它可以接受一个可选的消息参数,用于提供有关为何该代码已过时的信息。

[Serializable] 特性:[Serializable]特性用于标记一个类可以序列化,以便将对象转换为字节流。例如:

[Serializable]
public class SerializableClass
{
    // 类的成员
}

3、自定义特性

当然大家也可以自定义特性,以满足项目的特定需求。通常自定义特征需要继承Attribute类,并在类上面加AttributeUsage特性,然后在这下面处理需要的逻辑,具体看之前我的一篇自定义特性的文章.NET特性(Attribute)简单自定义。下面是自定义了一个显示作者等信息的特性。

[AttributeUsage(AttributeTargets.Class, Inherited = false, AllowMultiple = false)]
public class AuthorInfoAttribute : Attribute
{
    public string Author { get; }
    public string Version { get; }


    public AuthorInfoAttribute(string author, string version)
    {
        Author = author;
        Version = version;
    }
}
//使用特性
[AuthorInfo("DotNet开发跳槽", "1.0")]
public class MyAwesomeClass
{
    // 类的成员
}

4、特性的应用场景

那么特性通常用在什么地方呢?

特性在.NET生态系统中有多种应用场景,比如代码文档的生成;代码分析和验证,比如属性的Name字段长度验证等;可以依赖注入;最最重要的是可以实现AOP(面向切面编程),比如可以用于日志记录和性能监控等。

5、 特性的运行时和编译时用法

特性在C#中既具有运行时用途,通过反射机制可以在程序运行时动态检查和操作已应用特性的代码元素,又具有编译时用途,可在编译时影响编译器的行为,例如条件编译、代码生成和静态分析,从而为开发者提供了在代码的不同阶段(编译和运行时)对代码进行元数据标记和定制的灵活性和功能。

6、特性的属性访问

通过反射,您可以访问已应用于代码元素的特性及其参数。在上篇介绍反射(C#反射知识点)的文章已经有所介绍。下面演示如何检查并获取类上的自定义特性信息。

Type type = typeof(MyAwesomeClass);
var attributes = type.GetCustomAttributes(typeof(AuthorInfoAttribute), false);
if (attributes.Length > 0 && attributes[0] is AuthorInfoAttribute authorInfo)
{
    Console.WriteLine($"作者: {authorInfo.Author}, 版本号: {authorInfo.Version}");
}
//上面的代码将打印MyAwesomeClass类的特性,展示出特性属性的作者和版本号。

结语

本文讲述了C#特性的一些知识点,比如自定义特性、内置特性、获取特性内容等,这些知识点都是.NET开发应该掌握的。

希望本文提供的C#特性知识对每个.NET开发者都有所帮助,对于C#特性的知识点,你还知道哪些?欢迎留言讨论或者吐槽本文。

参考:

1、微软官网:

learn.microsoft.com/zh-cn/dotnet/csharp/language-reference/language-specification/attributes

2、AI查询

**推荐阅读

1、.NET无处不在的特性(Attribute)1-探究

2、.NET无处不在的特性(Attribute)2-简单自定义

3、面试必备:聊聊C#特性(Attribute)

来源公众号:DotNet开发跳槽  
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 206,214评论 6 481
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 88,307评论 2 382
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 152,543评论 0 341
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 55,221评论 1 279
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 64,224评论 5 371
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 49,007评论 1 284
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,313评论 3 399
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,956评论 0 259
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 43,441评论 1 300
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,925评论 2 323
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,018评论 1 333
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,685评论 4 322
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,234评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,240评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,464评论 1 261
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,467评论 2 352
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,762评论 2 345

推荐阅读更多精彩内容