/// <summary> /// 窗体加载 /// </summary> /// <param name="sender"></param> /// <param name="e"></param> void MainWindow_Loaded(object sender, RoutedEventArgs e) { string filename = @"D:\ThunderErp\4.0.0\实现工作流\酒卡系统\ThunderRecipeCard.ViewModel\bin\Debug\ThunderRecipeCard.ViewModel.dll"; Assembly myAssembly = Assembly.LoadFrom(filename); Type[] typearr = myAssembly.GetTypes();//获取类型 foreach (Type type in typearr)//针对每个类型获取详细信息 { //创建该类型的实例 object obj = System.Activator.CreateInstance(type); //获取类型的结构信息 ConstructorInfo[] myconstructors = type.GetConstructors(); //获取类型的字段信息 FieldInfo[] myfields = type.GetFields(); //获取方法信息 MethodInfo[] myMethodInfo = type.GetMethods();
//调用方法
string s = (string)myMethodInfo[0].Invoke(obj, null);
//获取属性信息 PropertyInfo[] myproperties = type.GetProperties(); //获取事件信息 EventInfo[] Myevents = type.GetEvents(); } }
上面是我写的一个简单的示例,现在我个人的肤浅理解就是获得程序集中的属性和方法,这里我就不明白了,既然知道程序集的路径或者知道程序集的名字干嘛不在程序中直接引用呢?并且用反射创建实例的时候在写代码的时候根本就不知道该实例中有哪些方法、属性等,还有使用指定参数调用 时(MethodInfo),你根本就不知道该方法叫什么,是否有返回值,返回类型是什么,你都不知道,有什么用啊,各位大牛,求解,最好能解释下在什么情况下要用到反射,具体要怎么用,先谢谢了。
当你要在运行时创建并使用类实例的时候,当你想操作非本线程创建的实例的时候,你就会用到反射了。
例如,你从一个网络位置获取到一个xml格式的类定义,然后你需要使用该类的实例来处理一些业务。那么编程阶段,你完全不知道该xml会包含怎样的类定义,你只知道该类有一个方法可以处理的你业务,这时你怎么写?你会在本地自己定义一个类吗?你能保证你自己定义的类和该网络位置的类保持一致吗?
再例如,你的Form程序在处理一个耗时的业务,你会让你的界面一直处于等待状态吗?你的界面是一个运行时实例,你的Form后台线程如何将该业务的处理进度展示到界面上呢?
为什么要在运行时创建并使用类实例呢,我知道这个程序集 我为何不引用它
@吴小贱就是矫情: 当该程序集在远程位置,而远程位置为了保密或者安全,仅通过xml或者其他文本格式告诉你类定义的时候,你怎么办呢?
@飞扬的尘埃: 您的意思是指:我的程序只要调用远程的一个程序集中的某方法,就可以完成我的业务,但是对方不想把整个DLL给你,而是给你了一个XML的文档,告诉调用哪个方法,传哪些参数。是这样的吗?
@吴小贱就是矫情: 对的,这就是传说中的Web Service的基础,不管是什么语言的Web Servcie,都是建立在反射上的,这也是为什么Java写的Web Service,C#也能用。
@飞扬的尘埃: 谢谢您,还有一个问题还是不明白 当创建Assembly 对象的时候 一般用LoadFrom或者Load,第一个条件是必须要知道该程序集的绝对路径,第二个该程序集名字,我还有点轴的地方就是两者都能知道该程序集,为何不引用就得了(小弟愚昧,请拍 %>_<% )
@吴小贱就是矫情: 呃,就像你上面的代码,那个dll是字符串啊,也就是说,这个字符串是可以配置的啊,也就是说,在程序运行的时候,你可以修改这个字符串的值啊,也就是说,你可以在程序运行的时候,使用不同的dll啊,多么神奇啊,对吧。
@飞扬的尘埃: 谢谢您,我先理解理解,消化消化,不懂在请教啊
通过字符串创建实例;
获取对象属性名称;
动态创建实例
用的地方比较多呢...
楼上正解,反射在工作还是很重要的,很多都要用的!