Unity 通过Type来new对象

2019-08-16  本文已影响0人  摸狗

在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是全小写的。哈哈哈哈哈


1.gif

那么获得一个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一个对象呢?
我们可以这样:

class Test
{
      public Test()
      {
          Console.WriteLine("No param");
      }

      public Test(int a)
      {
          Console.WriteLine("int param");
      }

      public Test(float a)
      {
          Console.WriteLine("float param");
      }
  
      public Test(inta, float b, string str)
      {
          Console.WriteLine("int float sting param");
      }
}

static void Main(string[] args)
{
      //通过字符串Test获得对应的Test类
      //如果你的类名叫什么,这里的str就应该写什么
      string str = "Test"; 
      Type type = Type.GetType(str);
      
       
      //通过type获得它所有的构造器,也就是构造函数
      //这里获得的构造器是按顺序的,也就是从上往下,本例子是先无参数,再到int参数,再到float参数
      ConstructorInfo[] infoArray =  type.GetConstructors();
      
      //这一步是打印出构造器的参数
      for(int i = 0 ; i < infoArray.Length; i++)
          Console.WriteLine(infoArray[i].ToString());
     
      //利用构造器new出一个对象需要调用Invoke方法,需要传入一个object[]
      Object[]  obj = new Object[0];
      infoArray[0].Invoke(obj);
      
      //这时候就通过带有int参数的构造函数new出Test对象。
      Object[]  objint = new Object[1]{1};
      infoArray[1].Invoke(objint);
}
2.gif

除了上面获得全部构造器的方式,我们还可以这样获得一个指定的构造函数

       ConstructorInfo zeroInfo = type.GetConstructor(new Type[0]);

这时候得到的是一个没有参数的构造函数。

那么我要得到一个float的构造函数怎么做呢?

       ConstructorInfo floatInfo = type.GetConstructor(new Type[1]  { typeof(float) } );

同理如果是多个参数也需要传入多个类型的Type。
假设我们现在有一个三个参数的构造函数分别是 int float string

       ConstructorInfo TestInfo  = info.Getstructor(new Type[3] { typeof(int), typeof(float), typeof(string) });

还有一种获得构造器的方法,但是我觉得这个用起来没有那么方便。

       ConstructorInfo  mafan = info.Getstructor(BindingFlags.Instance | BindingFlags.Public, null, new Type[0], null);

同理这个也是获得一个无参数的够造函数,但是这个上面介绍的方法有什么区别呢,他多一个BindingFlags通过这个关键字来搜索构造器。

tips:
如果你的Type填写正确的类名却得到一个null,你需要考虑一下是不是你没有把类名的命名空间写进去
必须是全名称。


namespace xxx
{
     class sss{}
}

Type type = Type.GetType("xxx.sss");
123.gif

到这里通过Type来new出对应的对象就介绍完了,如果发现本文出现什么不正确的地方还请大家指出,谢谢大家的观看。

上一篇下一篇

猜你喜欢

热点阅读