关于Type.GetType()的问题

来源:互联网 发布:unity3d 加速器 编辑:程序博客网 时间:2024/05/17 22:20

做序列化测试的时候,我自己定义的一个MyObject类,序列化的时候用它的一个实例去GetType没问题,但是反序列化的时候用Type.GetType("MyObject")返回为null。why??

  于是从系统定义的类型开始,发现Type.GetType("String")同样返回为null,试着加上命名空间:Type.GetType("System.String")问题即刻得以解决。用同样的办法,加上我自己定义类的命名空间Type.GetType("Serialization.MyObject")就OK了。尽管我的CS文件都在同一个命名空间下,还是需要加上。但是这样:typeof(MyObject)就完全没问题。于是继续思考~~~~~~~~~

 

    继续测试:

Type type = Type.GetType("System.Data.SqlClient.SqlConnection");//null
Type type = Type.GetType("System.Data.SqlClient.SqlConnection,System.Data");//null

Type type = Type.GetType("System.Data.SqlClient.SqlConnection,System.Data,Version=1.0.3300.0,Culture=neutral, PublicKeyToken=b77a5c561934e089"); //成功  Type tt = typeof(SqlConnection)自然也没问题
  

  这个问题设计到命名空间和装配件的关系,要查找一个类,必须指定它所在的装配件,或者在已经获得的Assembly实例上面调用GetType。.Net装配件编译的时候,默认都引用了mscorlib.dll,可以省略装配件名称,除非在编译的时候明确指定不引用它,比如:   
     System.String是在mscorlib.dll中声明的,故Type = Type.GetType(“System.String”)是正确的。或者说是因为Type.GetType函数和"System.String"都System.dll这个程序集中。  
   而调用Type.GetType("System.Data.SqlClient.SqlConnection")会失败,是因为System.Data.SqlClient.SqlConnection不在System.dll中. 修改为Type.GetType("System.Data.SqlClient.SqlConnection","System.data")仍会失败,是因为必须指定强名称程序集才能唯一确定你所指定的程序集(dll)。如果你同时安装了.Net FrameWork1.0和1.1,那么就有2个不同的System.Data.dll。所以只用"System.Data"这个文件名称是不能确定你所指定的程序集的(dll).这也就是强名称程序集存在的原因之一。