Unity 通过Type来new对象
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Unity 通过Type来new对象相关的知识,希望对你有一定的参考价值。
参考技术A 在c#里可以通过Type来获得对应的类型。例如 int a = 4;
a.GetType(); 就可以得到一个int32的类型。
如果是 Class test a;
a.GetType(); 就可以得到一个test的类型。
那么GetType和另一个相似的typeof()有什么区别呢?
1. 使用方式不同,typeof传入的是一个类型,例如typeof(int), typeof(test);返回的是对应类型的type;
而GetType是传入一个变量或者是通过自身调用,例如int a = 3, a.GetType();返回一个int 的 type;
或者是Type.GetType("test"); 这样就返回一个test的type;
2. typeof是全小写的。哈哈哈哈哈
那么获得一个Type类型的变量怎么new出一个对应的对象呢。我们先来了解Type可以得到什么东西:
1.GetEnumNames() 返回枚举值数组,但是对应的必须是一个枚举类type才可以调用这个方法,不然会抛出异常。
2.GetEnumName(object) 需要传入一个值获得对应的枚举值,例如 enum Day h1 =1, h2 =2, h3 = 5
GetEnumName(1) 得到的就是一个h1,2得到的是h2, 3会得到null, 5 才会得到h3。
3.GetArrayRank() 返回数组类型的维度。必须是数组类型的不然会抛出异常,int [,] a = new [3,10]; 这是返回的是2,代表2维。
4.GetConstructors() 返回一个ConstructorInfo数组,获得构造器列表。
5.GetConstructor() 传入一个Type[]数组 返回一个ConstructorInfo对象,获得构造器。
当传入的type是一个Type[0]的数组,就是默认没有参数走的是默认构造函数,如果是Type[1]走的是一个参数的构造函数,
那么如果同时存在两个一个参数的构造函数怎么办,其实是通过type的类型判断的他会找对应的构造函数。
float a = 3.4;
现在有两个test(float a),test(int a), type.GetConstructor(new Type[1] a.GetType() );这样实际上得到的是test(float)的
够造函数。
6.GetCustomAttribute() 传入一个Type 返回一个 Attribute ,用于获得挂载在Type上的Attribute。
7.GetMethod(string); 传入方法名称获得对应的方法。返回的是一个MethodInfo。
那么我们怎么通过Type来new一个对象呢?
我们可以这样:
除了上面获得全部构造器的方式,我们还可以这样获得一个指定的构造函数
这时候得到的是一个没有参数的构造函数。
那么我要得到一个float的构造函数怎么做呢?
同理如果是多个参数也需要传入多个类型的Type。
假设我们现在有一个三个参数的构造函数分别是 int float string
还有一种获得构造器的方法,但是我觉得这个用起来没有那么方便。
同理这个也是获得一个无参数的够造函数,但是这个上面介绍的方法有什么区别呢,他多一个BindingFlags通过这个关键字来搜索构造器。
tips:
如果你的Type填写正确的类名却得到一个null,你需要考虑一下是不是你没有把类名的命名空间写进去
必须是全名称。
到这里通过Type来new出对应的对象就介绍完了,如果发现本文出现什么不正确的地方还请大家指出,谢谢大家的观看。
异常处理
元类中的__new__方法
__new__方法用于新建类对象,通过type调用__new__可以用来创建一个空的对象
__new__与__init__的区别
作为一个类对象必须具备三个组成部分,所以调用type中的__new__来完成组装
得到这个类对象需要返回,以供__init__来使用
异常处理
什么是异常处理?
什么是异常? 与正常情况不同的就是异常,在程序执行过程中,出现错误导致代码无法执行完毕,就称之为异常
常见异常
1 AttributeError 试图访问一个对象没有的树形,比如foo.x,但是foo没有属性x 2 IOError 输入/输出异常;基本上是无法打开文件 3 ImportError 无法引入模块或包;基本上是路径问题或名称错误 4 IndentationError 语法错误(的子类) ;代码没有正确对齐 5 IndexError 下标索引超出序列边界,比如当x只有三个元素,却试图访问x[5] 6 KeyError 试图访问字典里不存在的键 7 KeyboardInterrupt Ctrl+C被按下 8 NameError 使用一个还未被赋予对象的变量 9 SyntaxError Python代码非法,代码不能编译(个人认为这是语法错误,写错了) 10 TypeError 传入对象类型与要求的不符合 11 UnboundLocalError 试图访问一个还未被设置的局部变量,基本上是由于另有一个同名的全局变量, 12 导致你以为正在访问它 13 ValueError 传入一个调用者不期望的值,即使值的类型是正确的
组成异常的三部分:
1.追踪信息 2.异常类型 3.异常的值
如何排查错误:
1.定位错误发生的位置
(使用追踪信息
1.代码是自己写的,没有调用任何的内置模块与方法,那么错误发生位置一定在最后一行
2.如果代码调用内部模块与其他模块的方法:
1.是系统内置的模块 例如抛出位置object.py 不用去查看object类 它几乎不可能出错一定是你自己代码在调用时出了错误
2.别人写的模块是有可能出错的 所以 你可以按照追踪信息点击去看看
如果有很多追踪信息,找最后一行是自己写的代码的位置
2.查看异常类型 例如:IndexError
3.查看异常的值 例如: list index out of range
如果没有任何异常信息 但是程序就是不对 可以使用排除法
异常可以根据发生时间分为两类:
1.语法检测异常 (语法异常和缩进错误)
解释器在执行代码前会检测语法,检测通过才会执行,如果这个阶段出现异常,代码一行都不会执行
2.运行是异常
已经通过语法检测,在解析执行期间发生异常
异常处理语法:
语法1:
try: #可能发生错误的代码
except 异常类型: #当try 中发生错误时会执行expect中的代码 做一些补救措施
语法2
try:
except 异常类型:
except 异常类型:
except 异常类型:
语法3 #在一个except中可以有多个异常类型,用逗号隔开
try
except ():
语法4: #万能异常 尽量少用 程序即不报错 也不正常运行 无法定位错误位置
# 建议输出错误信息
try:
except Exception:
语法5: # +as 使用 通过给异常取别名获取异常的对象,对象中包含了错误信息
try:
except Exception as e:
#e 输出错误信息
print(e)
语法6: # 先捕获能够明确的异常类型,最后捕获万能异常
try:
except ZeroDivisionError:
except IndexError:
except Exception as e:
语法7
try:
except:
else
语法8
import io
finally #无论是否发生异常最后都会执行finally 中的代码
使用场景:
1 try: 2 print(‘start‘) 3 f = open(‘‘,‘rt‘,encoding=‘utf-8‘) 4 f.write(‘123456‘) 5 print(‘end‘) 6 except FileNotFoundError: 7 print(‘文件路径错误....‘) 8 except io.UnsipporatedOperation: 9 print(‘文件不能被写入...‘) 10 finally: 11 f.close() 12 print(f.close)
正确使用异常处理的步骤:
1 """ 2 1.如果能明确知道异常发生原因 就不要产生异常 使用if判断等方式 3 2.不知道异常发生的原因 但是知道异常的类型 那就明确捕获该类型的异常 4 3.不知道发生原因 也不知道 异常的类型 可以使用万能异常 但是一定要打印异常消息 5 """
为什么要主动抛出异常?
1 #当写了一些功能,是提供给别人的,然而使用者不按照规则会用,就会导致程序出错,而我们无法帮助用户处理这个错误 2 #需要用raise 主动抛出异常 后面跟任意Exception的子类
自定义异常类
1 class MuException(Exception): 2 pass
断言: assert
断定 很确定某个条件是成立的
有一段代码要执行必须要保证某个条件是成立的
简化代码,后面必须跟bool表达式
直抛出异常AssertionError 局限性在于 异常类型固定,而且不能指定异常信息
以上是关于Unity 通过Type来new对象的主要内容,如果未能解决你的问题,请参考以下文章
Unity3D杂烩:位置修改,子对象获取,组件获取,通过脚本文件获取被绑定对象