c#反射/映射 学习摘录

转载 2007年09月23日 14:06:00

最近想研究一下反射,先上网找了找资料,几乎大部分都是照抄MSDN的内容,生涩难懂,几乎没说,又找了找,发现一些强人的实例解析,才稍微有了点门道,个人感觉,反射其实就是为了能够在程序运行期间动态的加载一个外部的DLL集合,然后通过某种办法找到这个DLL集合中的某个空间下的某个类的某个成员(通过反射可以访问该类所包含的所有成员,不论成员是公有还是私有),看看网上N人写的实例:

1.运用反射调用其它程序集中的方法:  
  假设另一个工程中的所有类都编译到一个dll文件中了,在这很多的类当中,有一个类叫StringUtil,名称空间在HSMP.CommonBasic.Common下  
  该类中有一个方法:  
  public   double   GetSum(double   x,double   y)  
  {  
  return   x+y;  
  }  
  编译后dll文件的存放路径是:D:/Test/HSMP.CommonBasic.dll  
  现在的问题是,如何通过程序调用该dll文件中的GetSum方法  
  大概有以下几步:  
  using   System.Reflection;  
  A.  
  //这里要用LoadFrom,只有在本工程里添加了该dll的引用后才可以使用Load  
  Assembly   objAss   =   Assembly.LoadFrom(@"D:/Test/HSMP.CommonBasic.dll");  
  //HSMP.CommonBasic.Common.StringUtil类的全路径  
  Type   t=objAss.GetType("HSMP.CommonBasic.Common.StringUtil");    
  //动态生成类StringUtil的实例  
  object   obj=System.Activator.CreateInstance(t);  
  //参数信息,GetSum需要两个int参数,如果方法没有参数,就声明一个长度为0的数组  
  System.Type[]   paramTypes   =   new   System.Type[2];  
  paramTypes[0]   =   System.Type.GetType("System.Int32");  
  paramTypes[1]   =   System.Type.GetType("System.Int32");  
  //找到对应的方法  
  MethodInfo   p   =   t.GetMethod("SayHello",   paramTypes)  
  //参数值,如果所调用的方法没有参数,不用写这些  
  Object[]   parameters   =   new   Object[2];  
  parameters[0]   =   3;  
  parameters[1]   =   4;  
  object   objRetval   =   p.Invoke(obj,   parameters);   //如果没有参数,写null即可。  


2.动态加载, 更改, 增加...某个程序集
下面例子中, ChangeValue类的myValue本是私有字段,
一般情况下在类外部是不能改它的值的, 但利用反射就能改了
-----------------------------------------------------
using System;
using System.Reflection;

class ChangeValue
{
private string myValue;
public ChangeValue(string str)
{
myValue = str;
}
public void WriteLine()
{
Console.WriteLine("MyValue is: " + myValue);
}
}
class Test
{
public static void Main(string[] args)
{
ChangeValue cv = new ChangeValue("old value");
cv.WriteLine();

Type t = cv.GetType();
FieldInfo field = t.GetField("myValue",
BindingFlags.NonPublic |BindingFlags.Instance);
field.SetValue(cv, "new value");

cv.WriteLine();
}
}
----------------------------------------------------
再打个比方, 你要写一个播放器, 要支持如mp3, wmv, avi...等格式,
你还希望用户能自己安装一个新的格式, 也就是我们常说的插件.
在实现这些, 可能你要将每种格式都写成单个的解码程序集, 如
mp3.dll, wmv.dll, avi.dll....
这样当播放时, 根据扩展名去动态调用相应的解码程序集, 那么这时你就得
用反射去动态加载这些dll了.如: Assembly.LoadFile ("...avi.dll")
然后通过反射可以用avi.dll里面定义的类了
 

C#反射技术的简单操作(读取和设置类的属性)

public class A { public int Property1 { get; set; } } static void Main() { A aa = new A(); ...
  • jumtre
  • jumtre
  • 2015年01月28日 15:15
  • 1278

C#反射的学习(一)--获得成员信息

在学习反射的时候,看到这篇文章了。自己测试了结果。 代码中的枚举说明见这里BindingFlags和这里MemberTypes...
  • u011976408
  • u011976408
  • 2017年02月16日 10:48
  • 293

理解C#反射机制

反射是.NET中的重要机制,通过反射可以得到*.exe或*.dll等程序集内部的接口、类、方法、字段、属性、特性等信息,还可以动态创建出类型实例并执行其中的方法。...
  • xiaouncle
  • xiaouncle
  • 2016年11月01日 13:12
  • 1852

Java中工厂、配置文件和反射学习

学习程序的最好方式就是编代码实现它,这里我们假设一个场景为要开一个晚会,晚会的流程为:1.晚会开始;2.唱歌;3.舞蹈;4.小品;5结束。 一、传统方法 1、新建java项目:party 2、在...
  • longshengguoji
  • longshengguoji
  • 2014年08月24日 15:20
  • 2095

C#利用反射实现两个类的对象之间相同属性的值的复制

在使用c#进行程序编写时,会遇到一个问题,两个属性字段差不多相同的类要进行一个互相的转换,如 这样的两个类 class A { int Id; int age; string phone; str...
  • u013093547
  • u013093547
  • 2016年12月12日 16:40
  • 3470

C# 通过反射把数据库中的表打包成对象

///         /// 根据指定类型,从数据库中获取数据,存放到List集合中         ///         /// 泛型对象         /// 类类型,即数据库中...
  • limlimlim
  • limlimlim
  • 2013年03月11日 17:27
  • 5717

【C#反射-Type类】

一.反射的作用: 查看和遍历类型和类型的元数据;动态创建类型实例,动态的调用所创建的实例方法和字段,属性,迟绑定方法和属性。 二.获取Type对象实例: 反射的核心类-Type,封装了关于类...
  • heyangyi_19940703
  • heyangyi_19940703
  • 2016年05月07日 16:20
  • 891

JDBC连接数据库反射实现O/R映射(2)

测试preparedStatement   public void testPreparedStatement(){ Connection connection=null; Pr...
  • luming_xml
  • luming_xml
  • 2016年06月05日 13:14
  • 827

JAVA中的反射机制

反射,当时经常听他们说,自己也看过一些资料,也可能在设计模式中使用过,但是感觉对它没有一个较深入的了解,这次重新学习了一下,感觉还行吧!            一,先看一下反射的概念:      ...
  • liujiahan629629
  • liujiahan629629
  • 2014年01月08日 22:31
  • 371998

C#中使用反射的优缺点

优点:             反射提高了程序的灵活性和扩展性,降低耦合性,提高自适应能力。它允许程序创建和控制任何类的对象,无需提前硬编码目标类;   缺点:            1、性能问题:使...
  • SpringFileld
  • SpringFileld
  • 2014年01月01日 12:30
  • 3470
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:c#反射/映射 学习摘录
举报原因:
原因补充:

(最多只允许输入30个字)