C# 反射/映射学习
最近想研究一下反射,先上网找了找资料,几乎大部分都是照抄MSDN的内容,生涩难懂,几乎没说,又找了找,发现一些强人的实例解析,才稍微有了点门道,个人感觉,反射其实就是为了能够在程序运行期间动态的加载一个外部的DLL集合,然后通过某种办法找到这个DLL集合中的某个空间下的某个类的某个成员(通过反射可以访问该类所包含的所有成员,不论成员是公有还是私有),看看网上N人写的实例:
1.运用反射调用其它程序集中的方法:
假设另一个工程中的所有类都编译到一个dll文件中了,在这很多的类当中,有一个类叫StringUtil,名称空间在HSMP.CommonBasic.Common 代码如下 :
{
class StringUtil
{
public double GetSum(double x, double y)
{
return x + y;
}
}
}
编译后dll文件的存放路径是:D:\Test\HSMP.CommonBasic.dll
现在的问题是,如何通过程序调用该dll文件中的GetSum方法
大概有以下几步:
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参数
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);
// 也可以不给类型参数,下面调用时给实参就可以
MethodInfo p = t.GetMethod("SayHello");
//参数值,如果所调用的方法没有参数,不用写这些
Object[] parameters = new Object[2];
parameters[0] = 3;
parameters[1] = 4;
//如果没有参数,写null即可。
object objRetval = p.Invoke(obj, parameters);
通过代码可以看出反射其实很简单。就是动态类型加载。
以上我们用反射对静态类型做加载,但如果类是个范型类该怎么办呢?其实方法大同小异,只是获取到类型时需要设置一下实际要使用的类型即可,先看范型类定义:
{
class StringUtil<T,U>
{
public string GetSum(T x, U y)
{
return x + " and " + y;
}
}
}
再看反射操作:
//HSMP.CommonBasic.Common.StringUtil类的全路径(范型类最后用 `2 标示需要2个范型类型参数)
Type t = objAss.GetType("HSMP.CommonBasic.Common.StringUtil`2");
// 这一步很重要,设置实际的范型类型
t = t.MakeGenericType(new Type[2] { typeof(string), typeof(string) });
//动态生成类StringUtil的实例
object obj = System.Activator.CreateInstance(t);
... 后面代码相同
还有一种情况,如果类是常类,但方法是范型方法改怎么办?非常简单:
//HSMP.CommonBasic.Common.StringUtil类的全路径(范型类最后用 `2 标示需要2个范型类型参数)
Type t = objAss.GetType("HSMP.CommonBasic.Common.StringUtil`2");
// 这一步要去掉,因为类不是泛型类所以不能给类设置范型类型
//t = t.MakeGenericType(new Type[2] { typeof(string), typeof(string) });
... 中间代码相同
MethodInfo p = p.MakeGenericMethod(new Type[2] { typeof(string), typeof(string) });
... 后面代码相同
2.动态加载, 更改, 增加...某个程序集
下面例子中, ChangeValue类的myValue本是私有字段,
一般情况下在类外部是不能改它的值的, 但利用反射就能直接访问私有字段而不需要通过包装器
{
// 这是私有字段
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");
//输出的是新值 "new value"
cv.WriteLine();
}
}
打个比方, 你要写一个播放器, 要支持如mp3, wmv, avi...等格式, 你还希望用户能自己安装一个新的格式, 也就是我们常说的插件.
在实现这些, 可能你要将每种格式都写成单个的解码程序集, 如 mp3.dll, wmv.dll, avi.dll.... 这样当播放时, 根据扩展名去动态调用相应的解码程序集, 那么这时你就得用反射去动态加载这些dll了.如: Assembly.LoadFile ("...avi.dll"), 然后通过反射可以用avi.dll里面定义的类了.
转载于:https://www.cnblogs.com/kingcat/archive/2007/09/03/879873.html
C# 反射/映射学习相关推荐
- Hibernate 多表映射(Mybatis,Springjdbc,Hibernate ,JDBC的多表映射学习比较)
from:http://blog.zenika.com/index.php?post/2012/03/28/Presentation-de-MyBatis Mybatis,Springjdbc,Hib ...
- resultType映射学习
resultType映射学习 博客作为个人学习笔记,随着学习深入更新. 接上一篇MySQL中的关联查询 (1)Question:resultType是什么 resultType是MyBatis框架中的 ...
- java 反射 代码_java反射机制学习代码
根据 http://www.iteye.com/topic/137944 文档进行学习 代码如下: package reflectTest; import java.lang.reflect.*; i ...
- 反射 数据类型_这是一份超全面详细的Java反射机制学习指南
Java反射说的是在运行状态中,对于任何一个类,我们都能够知道这个类有哪些方法和属性.很多千锋的学员在面试中都会被问到Java反射机制这个问题,为了帮助大家更好的掌握这个知识点,千锋武汉Java培训小 ...
- mybatis resultMap映射学习笔记
这几天,百度mybatis突然看不到官网了,不知道百度怎么整的.特此贴出mybatis中文官网: http://www.mybatis.org/mybatis-3/zh/index.html 一个学习 ...
- [OpenCV] cv.remap() 重映射学习笔记/map1 map2易混点
文章目录 一.背景 二.Notes (一)更新几个小例子方面理解remap 1. 利用remap 进行 copy 2.进行翻转 学习remap的时候发现map1和map2的参数跟我的直观理解略有差别, ...
- Java:反射机制学习
文章目录 前言 一.Java反射机制具体是什么 为什么Java要有反射机制,为什么像C++之类的语言不需要有反射机制 反射机制宏观上能让我们做些什么 二.通过反射获取运行时标识Class类 1.Cla ...
- java反射基础学习
1.什么是反射? JAVA反射机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法:对于任意一个对象,都能够调用它的任意一个方法和属性:这种动态获取的信息以及动态调用对象的方法的功能称 ...
- Java 反射系列 —— 学习笔记
Java 反射系列 1. 类成员 为了更好的描述,我们做个约定个通配符 XXXX, 如果是成员变量就代表 Field, 如果是类方法就代表 Method, 如果是构造器就代表 Constructor. ...
最新文章
- 记录服务器连接jupyter notebook过程
- AI真人表情包、斗地主AI......DeeCamp学员做了50个好玩又实用的AI项目
- 产生高斯数据集的scikit-learn API
- 对序列连续计算平均数和方差
- python三维数据转换成二维_5大Python可视化库到底选哪个好?一篇文章搞定从选库到教学...
- mysql g月份分组_PowerBI快捷键——视觉对象分组功能
- 动词变名词的变化规则_动词第三人称单数的变化规则及练习(含语音)
- android 自定义桌面图标大小设置,手机桌面图标尺寸可以改?OriginOS重新定义个性化...
- Linux学习第三步(Centos7安装mysql5.7数据库)
- devops与itsm集成_如何解决DevOps与ITSM文化冲突
- 推进 DevSecOps 走向未来
- 查找某组织下子库存与物料信息
- HDFS YARN zookeeper HBASE HIVE HIVE hwi的启动
- 关于LED限流电阻计算的那些事儿
- 计算智能的三个主要分支及其应用
- 关于提问的一些书籍及文章
- 2022考研该如何准备?zym勿入,因为大佬都不需要考研!
- 现控计控中基于留数法Z变换与Z反变换的MATLAB实现
- 大数据Spark(三十九):SparkStreaming实战案例四 窗口函数
- Mac设置chrome浏览器跨域