美文网首页
Unity 通过Type来new对象

Unity 通过Type来new对象

作者: 摸狗 | 来源:发表于2019-08-16 10:20 被阅读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出对应的对象就介绍完了,如果发现本文出现什么不正确的地方还请大家指出,谢谢大家的观看。

    相关文章

      网友评论

          本文标题:Unity 通过Type来new对象

          本文链接:https://www.haomeiwen.com/subject/dsrzjctx.html