Sorry, your browser cannot access this site
This page requires browser support (enable) JavaScript
Learn more >

特性

一、什么是特性

特性是一种允许我们向程序的程序集添加元数据的语言结构,它是用于保存程序结构信息的某种特殊类型的类 特性提供功能强大的方法以将声明信息与 C#代码(类型、方法、属性等)相关联。 特性与程序实体关联后,即可在运行时使用反射查询特性信息 特性的目的是告诉编译器把程序结构的某组元数据嵌入程序集中,它可以放置在几乎所有的声明中(类、变量、函数等等申明) 说人话: 特性本质是个类,我们可以利用特性类为元数据添加额外信息 比如一个类、成员变量、成员方法等等为他们添加更多的额外信息!之后可以通过反射来获取这些额外信息

二、自定义特性

继承特性的基类:Attribute

命名方式:特性名+Attribute 使用时 Attribute 可以省略

1
2
3
4
5
6
7
8
class MyCustomAttribute:Attribute
{
public string info;
public MyCustomAttribute(string info)
{
this.info = info;
}
}

三、特性的使用

1.基本语法:

[特性名(参数列表)] 本质上 就是调用特性类的构造函数

2.书写位置:

  • 函数、函数的参数
  • 变量的上一行
  • 表示他们具有该特性的信息
1
2
3
4
5
6
7
8
9
[MyCustom("自己写的类")]
class MyClass
{
[MyCustom("这是一个函数")]
public void TestFun()
{

}
}

3.判断是否某个使用了某个特性

  1. 获得需要判断类的 Type
  2. 再使用.IsDefinded(type(特性),false)进行判断 参数一: 特性的类型 参数二:代表是否搜索继承链(属性和事件忽略此参数)
1
2
3
4
5
Type t = typeof(MyClass);
if(t.IsDefinded(type(MyCustomAttribute),false))
{
Debug.Log("MyClass使用了MyCustomAttribute特性");
}

4.获取 Type 元数据中的所有特性

1
2
Type t = typeof(MyClass);
object[] array = t.GetCustomAttributes(true);

四、限制特性的使用范围

通过给特性类 加特性 限制其使用范围

1
2
3
4
5
6
7
8
[AttributeUsage(AttribiteTargets.Class | AttributeTagets.Struct,AllowMutiple = true,Inherited = true)]
//参数一:AttributeTagets —— 特性允许使用地点
//参数二:AllowMutiple —— 是否允许多个特性实例使用在同一个目标上
//参数三:Inherited —— 特性是否能被派生和重写成员继承
public class MyClass2Attribute:Attribute
{

}

五、系统自带特性

1.过时特性

Obsolete 用于提示用户 使用的方法等成员已经过时 建议使用新方法 一般加在函数前的特性

1
2
3
4
5
6
7
8
9
10
11
[Obsolete("OldSpeak方法已经过时了,请使用Speak方法")]
//参数一:调用该方法时,提示的内容
//参数二:true-使用该方法时会报错 | false-使用该方法时会报错
public void OldSpeak()
{

}
public void Spead()
{

}

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(组件名))] 指定莫格脚本依赖组件,确保脚本附加到游戏对象上时,
所需组件也会自动添加到游戏对象上(若存在不会自动添加)

评论