反射是高级语言里面很强大的一种机制。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的完整路径来获取类型信息。