c#反射/映射 学习摘录
来源:互联网 发布:ff14敖龙族捏脸数据 编辑:程序博客网 时间:2024/05/19 03:21
最近想研究一下反射,先上网找了找资料,几乎大部分都是照抄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#反射/映射 学习摘录
- c#反射/映射 学习摘录
- Java反射机制学习摘录
- C# 利用反射动态创建对象[摘录]
- C#根据反射实现ORM映射
- 学习C#必须掌握的东西-摘录
- C#学习:委托摘录 《自学系列》
- 学习反射机制 c#
- C#反射学习(一)
- C#反射学习
- c#反射的学习
- C#反射学习(一)
- 学习 c# 反射机制
- C#反射学习
- C#反射方法学习
- C#反射Reflection学习
- C#反射技术学习
- C# 反射学习
- squid服务的应用[转]
- 自动分割SQUID的日志,并每天生成一个日期格式文件名的日志
- 探索Win32系统之窗口类(Window Classes in Win32)
- 活动目录 AD 学习笔记
- 使用Python帮助我们解决实际问题(1)
- c#反射/映射 学习摘录
- 那一刻我泪留满面
- C#中的反射二
- Memory space manipulating in Java(Section one:Basic Concepts in Java)
- VBA增加sheet,重名时自动命名
- C# 编码规范和编程好习惯
- 多线程中AfxGetApp()->m_pMainWnd和AfxGetMainWnd() 的区别?
- 一些sql 语句(行列转换等)
- GDI(一)