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

时间:2021-12-23 04:22:10

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

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

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

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

[c-sharp]  

 

using System;  

using System.Collections.Generic;  

using System.Reflection;  

using System.IO;  

  

namespace Test{  

public delegate Object TwoInt32s(Int32 n1, Int32 n2);  

public delegate Object OneString(String s1);  

  

  

class App  

{  

    public static void Main(String[] args)  

    {  

        //Type delType = Type.GetType("TwoInt32s");//错误的调用方法  

        Type delType = Type.GetType("Test.OneString");//正确的调用方法  

        if (delType == null)  

        {  

            Console.WriteLine("Invalid delType argument: " + "TwoInt32s");  

            return;  

        }  

}  

}  

}  

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

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

[c-sharp]  

 

using System;  

using System.Collections.Generic;  

using System.Reflection;  

using System.IO;  

  

public delegate Object TwoInt32s(Int32 n1, Int32 n2);  

public delegate Object OneString(String s1);  

  

  

class App  

{  

    public static void Main(String[] args)  

    {  

         

        Type delType;  

        delType = Type.GetType("System.IO.File");//正确方法  

         //delType = Type.GetType("File");//错误   

       delType = Type.GetType("TwoInt32s");//正确的调用方法  

        //Type delType = Type.GetType("Test.OneString");  

        if (delType == null)  

        {  

            Console.WriteLine("Invalid delType argument: " + "TwoInt32s");  

            return;  

        }  

}  

}  

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