呵呵,又过了好几天啦,都没有在这里写什么东西啦.今天想写一写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,另一个是用于远程处理.(明天再写啦)
开始写博客的时候,感觉自己的博客这么难看,真是一点不爽.如果有谁看到的话提一个建议,以后把它改啦.唉....
C#写WinForm的时候,常常用到里面的资料文件.就比如加入一个窗体的背景图片.如果不加入资源文件的时候,只能把图片放入Bin目录下,然用Application.StartupPath+文件名从而加入图片.这一种法有一个不好的地方就是如果图片被用户删了什么办呢?所以我个人认为,最好用的就是导入资料文件.
导入资料文件很简单,这里就不用说啦.下面谈一谈引用资源文件的几个方法.有谁需要用到这一点知识的可以参考一下:
一,用反射的方法.
Assembly assem = this.GetType().Assembly;
Stream stream = assem.GetManifestResourceStream("Draw.Resources.xunmeng.jpg");
this.BackgroundImage = new Bitmap(stream);
二,常用的方法.
//这里用的引用的是字符串
ResourceManager resource = new ResourceManager(typeof(About));
this.label1.Text = (string)resource.GetObject("MyName");
三,资源文件读取类.
using (ResXResourceReader reader = new ResXResourceReader(@"About.resx"))
{
foreach (DictionaryEntry entry in reader)
{
if (entry.Key.ToString() == "MyName")
{
this.label2.Text = (string)entry.Value;
}
}
}
我个人比较喜欢用第二种方法.第一种方法也是比较好的,但第三种的话可能要出问题.具体的自己试一试好啦.
唉,该写一写博客啦.把日常的一些学习,体会,思想写进去不也是一件好事情吗?