关于Unity中的涉及到Attribute的相关概念整理(@WhiteTaken)

时间:2023-01-10 15:09:03

这两天事情比较多,没有来得及更新,现在把我这两天看的attributes相关内容进行整理。

涉及到的相关概念包括:

  • C#中的特性概念及用法
  • 创建自己的特性以及通过反射访问特性

C#中的特性概念以及用法:

  这个特性的概念,我还是比较喜欢称之为注解属性,官网上的定义,

特性具有以下属性:

  • 特性可向程序中添加元数据。 元数据是有关在程序中定义的类型的信息。 所有的 .NET 程序集都包含指定的一组元数据,这些元数据描述在程序集中定义的类型和类型成员。 可以添加自定义特性,以指定所需的任何附加信息。

  • 可以将一个或多个特性应用到整个程序集、模块或较小的程序元素(如类和属性)。

  • 特性可以与方法和属性相同的方式接受参数。

  • 程序可以使用反射检查自己的元数据或其他程序内的元数据。

  其实说白了,就是程序中的"[]"中括号之中的内容。

  一个声明中可以放置多个特性,某些特性可以多次赋给一个声明。

  某些特性对于给定实体可以指定多次。 例如,ConditionalAttribute 就是一个可多次使用的特性:

  

 [Conditional("DEBUG"), Conditional("TEST1")]
void TraceMethod()
{
// ...
}

  这里需要注意一点,根据约定,所有特性名称都以单词“Attribute”结束,以便将它们与“.NET Framework”中的其他项区分。 但是,在代码中使用特性时,不需要指定 attribute 后缀。 例如,[DllImport] 虽等效于 [DllImportAttribute],但 DllImportAttribute 才是该特性在 .NET Framework 中的实际名称。

特性的参数:

  许多特性都有参数,而这些参数可以是定位参数、未命名参数或命名参数。 任何定位参数都必须按特定顺序指定并且不能省略,而命名参数是可选的且可以按任意顺序指定。 首先指定定位参数。 例如,这三个特性是等效的:

[DllImport("user32.dll")]
[DllImport("user32.dll", SetLastError=false, ExactSpelling=false)]
[DllImport("user32.dll", ExactSpelling=false, SetLastError=false)]

特性的目标:

  特性的目标是应用该特性的实体。 例如,特性可以应用于类、特定方法或整个程序集。 默认情况下,特性应用于它后面的元素。 但是,您也可以显式标识要将特性应用于方法还是它的参数或返回值。显示的应用特性目标,可以这样:

[target : attribute-list]  

  target值的列表如下:

关于Unity中的涉及到Attribute的相关概念整理(@WhiteTaken)

  样例用法:

  • 将特性应用于程序集和模块

  

using System;
using System.Reflection;
[assembly: AssemblyTitleAttribute("Production assembly 4")]
[module: CLSCompliant(true)]
  • 在 C# 中将特性应用于方法、方法参数和方法返回值
// default: applies to method
[SomeAttr]
int Method1() { return ; } // applies to method
[method: SomeAttr]
int Method2() { return ; } // applies to return value
[return: SomeAttr]
int Method3() { return ; }

  无论规定 SomeAttr 应用于什么目标,都必须指定 return 目标,即使 SomeAttr 被定义为仅应用于返回值也是如此。 换言之,编译器将不使用 AttributeUsage 信息解析不明确的特性目标。


创建自己的特性以及通过反射访问特性:

直接上代码:(创建自己的特性)

 using UnityEngine;
using System.Collections;
using System; [AttributeUsage(AttributeTargets.Class|AttributeTargets.Field, //特性应用的目标
AllowMultiple=true, //是否可以在同一目标上放置多次
Inherited=false)] //是否允许子类使用此特性
public class myattr : Attribute { private string name;
public int version = ; //命名参数
public myattr(string _name) {
name = _name;
version = ;
} public string GetInputName() {
return name;
}
}

接下来使应用特性,并通过反射访问特性.

using UnityEngine;
using System.Collections;
using System;
using System.Reflection; [myattr("WhiteTaken1", version = )]
public class MyTest1 { }
[myattr("WhiteTaken2", version = ), myattr("WhiteTaken3", version = )]
public class MyTest2 { }
[myattr("WhiteTaken4")]
public class MyTest3 { }
public class MyTest4 { }
public class TestMyattr: MonoBehaviour { void Start () {
PrintMyattrInfo(typeof(MyTest1));
PrintMyattrInfo(typeof(MyTest2));
PrintMyattrInfo(typeof(MyTest3));
PrintMyattrInfo(typeof(MyTest4));
} void PrintMyattrInfo(Type _type) { Debug.Log("--打印信息--" + _type);
//应用反射
Attribute[] att = Attribute.GetCustomAttributes(_type);
//遍历特性
foreach (Attribute everyAttr in att) {
if (everyAttr is myattr) {
myattr _myattr = (myattr)everyAttr;
Debug.Log("version=" + _myattr.version + ",Name=" + _myattr.GetInputName());
}
}
Debug.Log("----------------------分隔符------------------------");
}
}

运行结果:

关于Unity中的涉及到Attribute的相关概念整理(@WhiteTaken)

创建自己的特性,需要继承System.Attribute类,并在自己的特性类之前应用AttributeUsage特性,并设置应用目标AttributeTargets,枚举类型成员如下。

关于Unity中的涉及到Attribute的相关概念整理(@WhiteTaken)

AllowMultiple是允许在一个目标上应用多次,如果为false,则只存在当前特性的一个,如果为true,当前特性可以添加多次,并用","隔开。

Inherited为false,子类不继承父类的特性。

基本的用法,接下来就是应用到自己的程序当中,另外附上一个github中看到的自定义特性的地址

未完,待续。。。

关于Unity中的涉及到Attribute的相关概念整理(@WhiteTaken)的更多相关文章

  1. Unity中资源打包成Assetsbundle的资料整理

    最近在研究Unity中关于资源打包的东西,网上看了一堆资料,这里做个整合,说整合,其实也就是Ctrl-C + Ctrl-V,不是原创 首先为了尊重原创,先贴出原创者的文章地址: http://blog ...

  2. Unity中使用Attribute

    Attribute是c#的语言特性 msdn说明如下: The Attribute class associates predefined system information or user-def ...

  3. 从Unity中的Attribute到AOP(五)

    今天主要来讲一下Unity中带Menu的Attribute. 首先是AddComponentMenu.这是UnityEngine命名空间下的一个Attribute. 按照官方文档的说法,会在Compo ...

  4. 从Unity中的Attribute到AOP(四)

    本篇我们将逐一讲解Unity中经常使用的Attribute(Unity对应的文档版本为2018.1b). 首先是Serializable,SerializeField以及NonSerialized,H ...

  5. 从Unity中的Attribute到AOP(七)

    本章我们将依然讲解Unity中的Attribute,继续命名空间在UnityEngine里的. PropertyAttribute,这个特性主要来控制变量或者类在Inspector里面的显示方式.和P ...

  6. 从Unity中的Attribute到AOP(三)

    上一篇我们对系统的Attributes进行了MSIL代码的查看,了解到了其本质就是一个类的构造函数.本章我们将编写自己的Attributes. 首先我们定义书的属性代码,如下: [AttributeU ...

  7. 【《Effective C#》提炼总结】提高Unity中C#代码质量的21条准则

    作者:Williammao, 腾讯移动客户端开发工程师 商业转载请联系腾讯WeTest获得授权,非商业转载请注明出处. 原文链接:http://wetest.qq.com/lab/view/290.h ...

  8. 【《Effective C#》提炼总结】提高Unity中C#代码质量的22条准则

    引言 原则1尽可能地使用属性而不是可直接访问的数据成员 原则2偏向于使用运行时常量而不是编译时常量 原则3 推荐使用is 或as操作符而不是强制类型转换 原则4 推荐使用条件属性而不是if条件编译 原 ...

  9. 【转】Effective C#观后感之提高Unity中C#代码质量的21条准则

    转自:http://blog.csdn.net/swj524152416/article/details/75418162 我们知道,在C++领域,作为进阶阅读材料,必看的书是<Effectiv ...

随机推荐

  1. SQL Server 事件通知(Event notifications)

    一.本文所涉及的内容(Contents) 本文所涉及的内容(Contents) 背景(Contexts) 基础知识(Rudimentary Knowledge) 事件通知监控DDL(NotifyQue ...

  2. 用ueditor上传图片、文件等到七牛云存储

    ueditor上传文件,是用数据流的形式上传的. 而七牛云存储官方文档中,只提供了文件路径上传的方式. 但是,仅仅是在官方文档中写了这一种方式. 事实上,利用VS的对象管理器,打开Qiniu的dll, ...

  3. js函数的可变参数

    //对于js的可变参数的清空,在定义函数式不需要写上参数, 在函数内部使用argument对象可以 直接获取参数个数等信息 //在调用函数式可以传递任意个数的参数 function text(){ v ...

  4. Redis系列四(keepalived&plus;lvs搭建负载均衡)

    1.安装Keepalived(主备服务器都要安装) 10.8.80.218  主服务器 10.8.80.217  备服务器 10.8.80.200  虚拟IP $ wget http://www.ke ...

  5. 怎么在linux ubuntu 上的nginx 绑定域名

    前一篇介绍了,如果在ubuntu上运行nodejs,毕竟访问的时候都是用ip地址+端口号,但是上production 环境都需要域名的,IP地址当然不行 读过上一篇的朋友知道了,如果在upstart ...

  6. nova boot from volume代码分析

    首先要创建一个bootable volume curl -i http://16.158.166.197:8776/v1/c24c59846a7f44538d958e7548cc74a3/volume ...

  7. Qt 快捷键

  8. 1、vue 笔记之 组件

    1.组件个人理解:  <组件>是页面的一部分,将界面切分成部分,每部分称为 <组件>   2.组件化思想:          //2.1.定义一个全局的组件,组件支持‘驼峰命名 ...

  9. 学习 JS滚轮事件&lpar;mousewheel&sol;DOMMouseScroll&rpar;

    学习 JS滚轮事件(mousewheel/DOMMouseScroll) 1-1 滚轮事件兼容性的差异   IE,chrome,safari 浏览器都使用 onmousewheel, 只有firefo ...

  10. &lbrack;django&rsqb;drf知识点梳理-权限

    用户 - 权限 - 资源 (拥有) (绑定) django权限机制能够约束用户行为,控制页面的显示内容,也能使API更加安全和灵活:用好权限机制,能让系统更加强大和健壮 django权限控制 Djan ...