上篇文章讲述了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开发跳槽