反射是高级语言里面很强大的一种机制。C#也给我们提供了强大的反射机制。反射使用起来非常简单,最常见的步骤是:
1,定义一个Type 对象, Type myType;
2,通过字符串或者其它流初始化该对象,MyType = Type.GetType("MyClass");
在Type.GetType()方法执行时,系统怎么根据字符串查找正确的类的定义呢?看下面代码
[c-sharp] view plain copy
- 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] view plain copy
- 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的完整路径来获取类型信息。
时间: 2024-10-10 23:29:19