目录
- 特性
- 1. 特性的定义和作用
- 2. 特性的分类
- 3. 预定义特性
- 4. 自定义特性
- 5. 特性的用法
- 6. 特性的属性
- 定义带多个参数的特性
- 使用带多个参数的特性
- 特性参数的位置
- 7. 反射与特性
- 小结
特性
C# 中的 Attribute(特性)是一种特殊的类,用于向程序中的各种元素(例如类、方法、属性等)添加元数据或声明性信息。以下是 C# 特性的详细介绍:
1. 特性的定义和作用
特性(Attribute)允许程序员向类型、成员(如类、方法、属性等)添加信息,这些信息可以在运行时通过反射获取。特性用于添加元数据,如编译器指令和注释、描述、方法、类等其他信息。
2. 特性的分类
.NET 框架提供了两种类型的特性:预定义特性和自定义特性。
3. 预定义特性
预定义的特性可以用来为代码添加元数据和指示编译器和运行时执行特定的操作。以下是一些常见的 .NET 预定义特性:
[Serializable]
:用于标记一个类或结构体可序列化,并可以在网络上传输或保存到磁盘上。[Obsolete]
:用于标记一个方法、属性或类已经过时,并提供相应的替代方案或建议。[Conditional]
:用于指定一个方法只有在满足特定条件编译指令时才会被编译。
4. 自定义特性
自定义特性继承自 System.Attribute
类。自定义特性可以用于各种目的,比如数据验证、日志记录等。自定义特性时,可以使用 AttributeUsage
属性来指定特性的应用范围。
5. 特性的用法
特性可以应用于程序集、模块、类型、字段、方法、参数、属性等。例如:
[AttributeUsage(AttributeTargets.Class | AttributeTargets.Method)]
public class MyAttribute : Attribute
{// 特性实现
}
6. 特性的属性
特性可以包含属性,这些属性可以存储与特性相关的数据。例如:
[AttributeUsage(AttributeTargets.Property)]
public class StringLengthAttribute : Attribute
{public int MaximumLength { get; private set; }public StringLengthAttribute(int maxLength){MaximumLength = maxLength;}
}
C# 中的特性(Attribute)可以带多个参数。这些参数通常是特性类的构造函数参数或者特性类中的属性。以下是如何定义和使用带有多个参数的特性的示例:
定义带多个参数的特性
你可以在特性类中定义多个属性来接受不同的参数:
public class MyAttribute : Attribute
{public string Name { get; set; }public int Value { get; set; }public MyAttribute(string name, int value){Name = name;Value = value;}
}
在这个例子中,MyAttribute
特性类有一个构造函数,它接受两个参数:name
和 value
。此外,这两个参数也作为属性公开,可以在应用特性时设置。
使用带多个参数的特性
当你将这个特性应用到类、方法或其他成员上时,你可以传递多个参数:
[MyAttribute("code", 100)]
public class MyClass
{// 类实现
}
在这个例子中,我们创建了一个 MyClass
类,并应用了 MyAttribute
特性,传递了两个参数:code
和 100
。
特性参数的位置
特性参数可以是位置参数或命名参数。位置参数必须按照特性构造函数中定义的顺序提供,而命名参数则不需要:
[MyAttribute("code", 100)] // 位置参数
[MyAttribute(Value = 100, Name = "code")] // 命名参数
public class MyClass
{// 类实现
}
在这两个例子中,MyAttribute
特性都被正确地应用到了 MyClass
上,尽管参数的传递方式不同。
7. 反射与特性
在运行时,可以通过反射(Reflection)来查询特性。反射提供了一种机制,允许程序在运行时检查和操作特性。
下面这个例子的作用说,轮询这个类对象的所有属性,判断该属性是否包含此特性,如果包含就进行特殊处理!
try{//this.GetType().GetProperties()表示获取this对象的全部属性foreach (var property in this.GetType().GetProperties()){//获取属性的特性var attribute = property.GetCustomAttribute<MyAttribute>();//如果包含此特性if (attribute != null){//通过特性的参数(属性名称,也是Key值),得到json中的值JObject inputs = JsonConvert.DeserializeObject<JObject>(node.Inputs);if (inputs == null) return;var inputValue = inputs[attribute.Name]?.ToString();if (!string.IsNullOrEmpty(inputValue)){//获取属性的类型var targetType = property.PropertyType;if (targetType == typeof(bool))property.SetValue(this, bool.Parse(inputValue));//设置属性值!else if (targetType == typeof(int))property.SetValue(this, int.Parse(inputValue));//设置属性值!}}}}catch (Exception ex){MessageBox.Show($"Error: {ex.Message}");}
这个例子是首先通过反射,获取对象的所有属性property,再判断该属性是否有特性attribute。
然后根据attribute的参数Name,对 属性property 进行特殊处理!
小结
特性可以用于实现高级编程技术,如依赖注入、AOP(面向切面编程)等。
特性是 C# 中一个强大的功能,它为代码提供了额外的元数据和灵活性,使得代码更加模块化和可配置。通过自定义特性,开发者可以创建强大的框架和库,以适应各种复杂的编程需求。