对于自己的第一的一个TestClass类
调用
Type type= Type.GetType("TestClass");
FieldInfo[] field =type.GetFields();
运行到第一句不报错
运行到第二句时就报错:说什么 对象没有一个设置一个实例TestClass y=new TestClass();
Type type=y.GetType();
FieldInfo[] field =type.GetFields();
没有报错
或者改成Type type=typeof(TestClass)
FieldInfo[] field =type.GetFields();
也不报错这里有什么区别?
调用
Type type= Type.GetType("TestClass");
FieldInfo[] field =type.GetFields();
运行到第一句不报错
运行到第二句时就报错:说什么 对象没有一个设置一个实例TestClass y=new TestClass();
Type type=y.GetType();
FieldInfo[] field =type.GetFields();
没有报错
或者改成Type type=typeof(TestClass)
FieldInfo[] field =type.GetFields();
也不报错这里有什么区别?
FieldInfo[] field =type.GetFields();
这句应该没有实例化TestClass吧
为什么不报错?
这个时候还不是你的testClass
而是
获取表示指定类型的 Type 对象
而
TestClass y=new TestClass();
Type type=y.GetType();y是用的父类object.getType();
Type 实例,表示当前实例的确切运行时类型。
typeof
若要获取表达式的运行时类型一个是对象 一个是类型
会在IL中间码上做些处理
比如
Type type=typeof(Class1)
FieldInfo[] field =type.GetFields();生成的中间码 会是这样
IL_0000: ldtoken ConsoleApplication3.Class1
IL_0005: call class [mscorlib]System.Type [mscorlib]System.Type::GetTypeFromHandle(valuetype [mscorlib]System.RuntimeTypeHandle)
IL_000a: stloc.0
IL_000b: ldloc.0
IL_000c: callvirt instance class [mscorlib]System.Reflection.FieldInfo[] [mscorlib]System.Type::GetFields()
IL_0011: stloc.1
IL_0012: retIL_0000的ldtoken是什么意思呢?
将元数据标记转换为其运行时表示形式,并将其推送到计算堆栈上。
Type type= Type.GetType("TestClass");
FieldInfo[] field =type.GetFields();
为什么会报 错误
是因为
你没指定名称空间
Type type= Type.GetType("System.Console");
FieldInfo[] field =type.GetFields();
这个时候还不是你的testClass
而是
获取表示指定类型的 Type 对象
~~~~~~~~~~~~~~~~~~~~~~~~~~~~
这句话怎么理解?
既然已经获得了指定类型的Type对象
难道不能取该类型对象的成员么?
或者只是说,Type type=Type.GetType("testClass")就像类的声明一样
只是 只是声明了这样的一个指定类型的Type对象.未对其分配内容 所以
FieldInfo[] field =type.GetFields();就去不到下面是msdn对typeof的说明:
typeof(type)
typeof 运算符用于获得某一类型的 System.Type对象
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
其中:
type
要获得其 System.Type 对象的类型。
备注
不能重载 typeof 运算符。
若要获得一个表达式的运行时类型,可以使用 .NET Framework 方法 GetType。
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~一个是类型,一个对象 楼主搞错了?
Type type= Type.GetType("TestClass");
FieldInfo[] field =type.GetFields();
为什么会报 错误
是因为
你没指定名称空间
~~~~~~~~~~~~~~~~~~他报的错是对象没有实例化
Type type= Type.GetType("System.Console");
FieldInfo[] field =type.GetFields();
Unhandled Eeception:System.NUllReferenceException:Object reference not set to an in stance of an object.
因为这里必须指定全名,比如Type.GetType("System.Int32"),像Type.GetType("string")是不行的.