100分全给,求C#中反射和remoting之类的学习之经验,和通俗些的解释
这两个东东,太难了,难于理解,更难以使用,请大家谈谈
这两个东东,太难了,难于理解,更难以使用,请大家谈谈
解决方案 »
- C# Open xml Word文件的操作
- listview加载大量数据问题
- 大家帮忙看看我的代码错在哪里?
- 小弟新手学触发器!小问题请高手指点
- form1窗体重的主菜单上有个添加按钮,点击后弹出另一添加窗体,关闭此添加窗体后,再点击即出错,为何?
- using Escel 找不到类型或命名空间名称“Excel”
- checkedlistbox列表中的内容怎么同过按纽移到到textbox里
- 怎么能判断TcpListener与TcpClient的连接已经关闭
- 树的问题
- 如何使DataGrid(WinForm)像Excel表格那样方便好用??
- select count(*)的问题
- 在Dataset中能不能实现两个表之间的关联查询。
using System.Reflection;
1、
Assembly assembly = Assembly.Load("A") ;A为程序集名称
Type t= assembly.GetType("A.B.C",true,true) ;A.B.C为类的全称
//动态创建实例
object obj = Activator.CreateInstance (t);2、
System.Reflection.Assembly ass = System.Reflection.Assembly.Load(nameSpace);
object obj = ass.CreateInstance(className);
Iobject op = (Iobject)obj;//Iobject为抽象类,是className的父类3、
using System.Reflection;
Assembly assembly = Assembly.LoadFrom("xxx.dll的路径");
Type[] aa = a.GetTypes();foreach(Type t in aa)
{
if(t.FullName == "a.b.c")
{
object o = Activator.CreateInstance(t);
}
}4、
使用System.Type.GetType
注:层次间都是一对多的关系 反射的作用: 1. 可以使用反射动态地创建类型的实例,将类型绑定到现有对象,或从现 有对象中获取类型 2. 应用程序需要在运行时从某个特定的程序集中载入一个特定的类型,以便实现某个任务时可以用到反射。 3. 反射主要应用与类库,这些类库需要知道一个类型的定义,以便提供更多的功能。 应用要点: 1. 现实应用程序中很少有应用程序需要使用反射类型 2. 使用反射动态绑定需要牺牲性能 3. 有些元数据信息是不能通过反射获取的 4. 某些反射类型是专门为那些clr 开发编译器的开发使用的,所以你要意识到不是所有的反射类型都是适合每个人的。 反射appDomain 的程序集 当你需要反射AppDomain 中包含的所有程序集,示例如下:
static void Main { //通过GetAssemblies 调用appDomain的所有程序集 foreach (Assembly assem in Appdomain.currentDomain.GetAssemblies()) { //反射当前程序集的信息 reflector.ReflectOnAssembly(assem) } } 说明:调用AppDomain 对象的GetAssemblies 方法 将返回一个由System.Reflection.Assembly元素组成的数组。 反射单个程序集 上面的方法讲的是反射AppDomain的所有程序集,我们可以显示的调用其中的一个程序集,system.reflecton.assembly 类型提供了下面三种方法: 1. Load 方法:极力推荐的一种方法,Load 方法带有一个程序集标志并载入它,Load 将引起CLR把策略应用到程序集上,先后在全局程序集缓冲区,应用程序基目录和私有路径下面查找该程序集,如果找不到该程序集系统抛出异常 2. LoadFrom 方法:传递一个程序集文件的路径名(包括扩展名),CLR会载入您指定的这个程序集,传递的这个参数不能包含任何关于版本号的信息,区域性,和公钥信息,如果在指定路径找不到程序集抛出异常。
在Remoting中是通过通道(channel)来实现两个应用程序域之间对象的通信的.首先,客户端通过Remoting,访问通道以获得服务端对象,再通过代理解析为客户端对象。这就提供一种可能性,即以服务的方式来发布服务器对象。远程对象代码可以运行在服务器上(如服务器激活的对象和客户端激活的对象),然后客户端再通过Remoting连接服务器,获得该服务对象并通过序列化在客户端运行。
在Remoting中,对于要传递的对象,设计者除了需要了解通道的类型和端口号之外,无需再了解数据包的格式。但必须注意的是,客户端在获取服务器端对象时,并不是获得实际的服务端对象,而是获得它的引用。这既保证了客户端和服务器端有关对象的松散耦合,同时也优化了通信的性能。
这是.Net中获取运行时类型信息的方式,.Net的应用程序由几个部分:‘程序集(Assembly)’、‘模块(Module)’、‘类型(class)’组成,而反射提供一种编程的方式,让程序员可以在程序运行期获得这几个组成部分的相关信息,例如: Assembly类可以获得正在运行的装配件信息,也可以动态的加载装配件,以及在装配件中查找类型信息,并创建该类型的实例。
Type类可以获得对象的类型信息,此信息包含对象的所有要素:方法、构造器、属性等等,通过Type类可以得到这些要素的信息,并且调用之。
MethodInfo包含方法的信息,通过这个类可以得到方法的名称、参数、返回值等,并且可以调用之。
诸如此类,还有FieldInfo、EventInfo等等,这些类都包含在System.Reflection命名空间下
比如说,有一个按钮点击要弹一个画面,但是要弹什么画面是在配置文件里面设置的,
也就是说这个画面可能会变更。这时要创建该画面的实例就要用反射,根据配置文件
里面的设置自动创建相应的实例,代码就不用变更了。
还有就是,我们经常在开发中写一个类,里面全部都是要用的属性(get,set)。
如果要对这个类加一个Clear方法,或者Compare方法,用反射就很容易了,可以直接
把这个类的所有属性全部找出来(怎么找请查看System.Type),然后用反射可以设置
或者取得其中的值。
我基本上就用过这些,其他还有什么,还请大家指出来。
总体感觉反射也不是太难。