呵呵,又过了好几天啦,都没有在这里写什么东西啦.今天想写一写C#中的反射.
其实很少有到反射,但反射在很多时候却有很大的作用.先说一说反射的一些基础的东西. 反射是一个普通用语.是用来描述运行过程中检查与处理程序的功能.反射可以完成的任务也有很多.比如枚举一个成员的信息,实例化新对象,执行对象实例,查找类型的信息,创建与编择新程序集等, 而我们常用的就是前面几个.
反射,其实就是程序通过记录一个类的信息,然后在需要的时候通这一个类的信息重建一个类,而这一个类的功能与那一个特定的类的功能一样,就像镜子里的东西一样,然后就可以创建类的实例.这就是反射.也是它的名称的由来吧!
先看一个类,System.Type,这一个类是在反射中用到的一个很重要很重要的类.它是一个其类,而对它赋傎的时候就相当于重它那里派生出了一个类.比如,Type t=typeof(double),t 就相当于从Type类派生出一个类,这一个类有与double有一个样的功能.这时就可以运用t 来创建实例啦.如 object d = Activator.CreateInstance(t,null)来创建一个double的实例.但当然,反射不是为了这样建立一个double类的实例的,但在很多时候,用这一种方法来建立一个类的实例会更加灵活.
Type类还可以获取一个类的信息,比如可以通过Getmethods()来获取它支持的方法,同时还可以通过GetMembers()来获取它所有的成员属性,还可以通过InvokeMember()来调用它的函数等.
然后说到Assembly,这一个类是用到记录一个程序集的信息与获取一个程序集里的所有信息,其中包括类的信息.Assembly 就可以与Type一同使用,然后通过反射的方法来重建类与类的实例.如
Assembly assembly = Assembly.LoadFrom(assemblyName);
foreach (Type type in assembly.GetTypes())
{
if (type.IsClass == true)
{
Console.WriteLine("...Found Class : {0}", type.FullName);
}
if (type.ToString()!="Test2.TestMe")
{
continue;
}
object[] obs = new object[] { 2, 4.5 };
object ob = Activator.CreateInstance(type,obs);
object result = null;
Console.WriteLine("......Dynamically Invoking compute() on {0} Class", type.FullName);
result = type.InvokeMember("Add", BindingFlags.Default | BindingFlags.InvokeMethod,null,ob, null);
Console.WriteLine("the result is :{0}", result);
}
最后说到反射的几个实用的地方,一个是用于COM,另一个是用于远程处理.(明天再写啦)