c# 反射时GetType方法查找Type的分析

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了c# 反射时GetType方法查找Type的分析相关的知识,希望对你有一定的参考价值。

反射是高级语言里面很强大的一种机制。C#也给我们提供了强大的反射机制。反射使用起来非常简单,最常见的步骤是:

1,定义一个Type 对象, Type myType;

2,通过字符串或者其它流初始化该对象,MyType = Type.GetType("MyClass");

 

在Type.GetType()方法执行时,系统怎么根据字符串查找正确的类的定义呢?看下面代码

 

[c-sharp] view plain copy
 
  1. using System;  
  2. using System.Collections.Generic;  
  3. using System.Reflection;  
  4. using System.IO;  
  5.   
  6. namespace Test{  
  7. public delegate Object TwoInt32s(Int32 n1, Int32 n2);  
  8. public delegate Object OneString(String s1);  
  9.   
  10.   
  11. class App  
  12. {  
  13.     public static void Main(String[] args)  
  14.     {  
  15.         //Type delType = Type.GetType("TwoInt32s");//错误的调用方法  
  16.         Type delType = Type.GetType("Test.OneString");//正确的调用方法  
  17.         if (delType == null)  
  18.         {  
  19.             Console.WriteLine("Invalid delType argument: " + "TwoInt32s");  
  20.             return;  
  21.         }  
  22. }  
  23. }  
  24. }  

 

这段代码说明Type.GetType在解析类型的时候如果参数字符串没有指定namespace将会导致程序不能正确解析类型。

 

如果我们把namespace去掉,得到下面的代码

 

[c-sharp] view plain copy
 
  1. using System;  
  2. using System.Collections.Generic;  
  3. using System.Reflection;  
  4. using System.IO;  
  5.   
  6. public delegate Object TwoInt32s(Int32 n1, Int32 n2);  
  7. public delegate Object OneString(String s1);  
  8.   
  9.   
  10. class App  
  11. {  
  12.     public static void Main(String[] args)  
  13.     {  
  14.          
  15.         Type delType;  
  16.         delType = Type.GetType("System.IO.File");//正确方法  
  17.          //delType = Type.GetType("File");//错误   
  18.        delType = Type.GetType("TwoInt32s");//正确的调用方法  
  19.         //Type delType = Type.GetType("Test.OneString");  
  20.         if (delType == null)  
  21.         {  
  22.             Console.WriteLine("Invalid delType argument: " + "TwoInt32s");  
  23.             return;  
  24.         }  
  25. }  
  26. }  
技术分享

 

 

这说明如果某类型被包含在namspace里面就必须要用包含namespace的完整路径来获取类型信息。

以上是关于c# 反射时GetType方法查找Type的分析的主要内容,如果未能解决你的问题,请参考以下文章

Type.GetType()反射另外项目中的类时返回null的解决方法

Type.GetType()反射另外项目中的类时返回null的解决方法

Type.GetType()在跨程序集反射时返回null的解决方法

C#中反射里的invoke方法的参数

Type.GetType()在跨程序集反射时返回null

C# 反射 GetType() 异常