特性
一、什么是特性
特性是一种允许我们向程序的程序集添加元数据的语言结构,它是用于保存程序结构信息的某种特殊类型的类 特性提供功能强大的方法以将声明信息与 C#代码(类型、方法、属性等)相关联。 特性与程序实体关联后,即可在运行时使用反射查询特性信息 特性的目的是告诉编译器把程序结构的某组元数据嵌入程序集中,它可以放置在几乎所有的声明中(类、变量、函数等等申明) 说人话: 特性本质是个类,我们可以利用特性类为元数据添加额外信息 比如一个类、成员变量、成员方法等等为他们添加更多的额外信息!之后可以通过反射来获取这些额外信息
二、自定义特性
继承特性的基类:Attribute
命名方式:特性名+Attribute 使用时 Attribute 可以省略
1 | class MyCustomAttribute:Attribute |
三、特性的使用
1.基本语法:
[特性名(参数列表)] 本质上 就是调用特性类的构造函数
2.书写位置:
- 类
- 函数、函数的参数
- 变量的上一行
- 表示他们具有该特性的信息
1 | [] |
3.判断是否某个使用了某个特性
- 获得需要判断类的 Type
- 再使用
.IsDefinded(type(特性),false)进行判断 参数一: 特性的类型 参数二:代表是否搜索继承链(属性和事件忽略此参数)
1 | Type t = typeof(MyClass); |
4.获取 Type 元数据中的所有特性
1 | Type t = typeof(MyClass); |
四、限制特性的使用范围
通过给特性类 加特性 限制其使用范围
1 | [] |
五、系统自带特性
1.过时特性
Obsolete 用于提示用户 使用的方法等成员已经过时 建议使用新方法 一般加在函数前的特性
1 | [] |
2.调用者信息特性
需要引用命名空间 using System.Runtime.Compilerservices; 一般作为函数参数的特性
| 特性名 | 描述 |
|---|---|
| CallerFilePath | 哪个文件调用? |
| CallerLineNumber | 哪一行调用? |
| CallerMemberName | 哪个函数调用? |
3.条件编译特性
需要引用命名空间 using system.Diagnostics;
conditional 它会和预处理指令#define 配合使用
主要可以用在一些调试代码上,有时想执行有时不想执行的代码
4.外部 Dll 包函数特性
需要引用命名空间 using system.Runtime.Interopservices
DllImport
用来标记非.Net(c#)的函数,表明该函数在一个外部的 DLL 中定义。 一般用来调用 c 或者 c++的 D11 包写好的方法
5.一些常用的特性
| 特性 | 作用 |
|---|---|
| [ExcuteInEditorMode] | 使用脚本在编辑器下也能执行 |
| [RequireComponent(typeof(组件名))] | 指定莫格脚本依赖组件,确保脚本附加到游戏对象上时, 所需组件也会自动添加到游戏对象上(若存在不会自动添加) |