Unity 通过Type来new对象
在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出对应的对象就介绍完了,如果发现本文出现什么不正确的地方还请大家指出,谢谢大家的观看。