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)
View Code

  正确使用异常处理的步骤:

技术分享图片
1 """
2 1.如果能明确知道异常发生原因 就不要产生异常  使用if判断等方式
3 2.不知道异常发生的原因 但是知道异常的类型 那就明确捕获该类型的异常
4 3.不知道发生原因 也不知道 异常的类型 可以使用万能异常 但是一定要打印异常消息
5 """
View Code

  为什么要主动抛出异常?

技术分享图片
1 #当写了一些功能,是提供给别人的,然而使用者不按照规则会用,就会导致程序出错,而我们无法帮助用户处理这个错误
2 #需要用raise 主动抛出异常 后面跟任意Exception的子类
View Code

  自定义异常类

技术分享图片
1         class MuException(Exception):
2             pass
View Code

断言: assert

     断定 很确定某个条件是成立的
          有一段代码要执行必须要保证某个条件是成立的
          简化代码,后面必须跟bool表达式
          直抛出异常AssertionError   局限性在于 异常类型固定,而且不能指定异常信息













































以上是关于Unity 通过Type来new对象的主要内容,如果未能解决你的问题,请参考以下文章

如何用Lua来访问Unity 控件的属性

通过指向对象来获取对象名称 Unity Raycast

Unity3D杂烩:位置修改,子对象获取,组件获取,通过脚本文件获取被绑定对象

unity 对象旋转,自转

原创Python 对象创建过程中元类, __new__, __call__, __init__ 的处理

new blob 参数