- 浏览: 31390 次
- 性别:
最新评论
反射介绍
- 博客分类:
- c#学习记录
static void Main(string[] args)
{
#region 反射介绍
//反射:通过动态获取程序集 获取其中的类型元数据 然后访问类型的过程
//反射中一个非常重要的类型就是Type
//1.如果获取Type类型的对象?
//获取Person类型的Type 对象 Type 对象中就是存放了一些关于某个类型的所有的信息的内容
//
//1>当没有对象的时候使用这种方式获取某个类型的Type
//Type type =typeof(Person);
//2>//当获得对象后就可以使用对象的GetType() 方法来获取指定对象的类型的Type对象
//Person p=new Person();
//Type personType = p.GetType();
////2.获取Person类中的所有的方法
//MethodInfo[] methods = personType.GetMethods();
////methods这个变量中存储了Person类中的所有的方法
////遍历输出每个方法的方法名
//for (int i = 0; i < methods.Length; i++)
//{
// //通过Type对象的GetMethods() 可以获取指定类型的所有的方法其中包括编译器自动
// //自动生成的以及从父类中继承来的方法 但是不包含private方法 需要使用其他方式
// Console.WriteLine(methods[i].Name);
//}
//Console.ReadKey();
// //3.获取某个类型的所有属性
//PropertyInfo[] properties= personType.GetProperties();
//for (int i = 0; i < properties.Length; i++)
//{
// Console.WriteLine(properties[i].Name);
//}
//获取类中所有字段
//FieldInfo[] fields = personType.GetFields();
//for (int i = 0; i < fields.Length; i++)
//{
// Console.WriteLine(fields[i].Name);
//}
// Console.ReadKey();
#endregion
#region 反射获取另外一个程序集中类型
//Assembly
//动态加载一个程序集
Assembly assembly = Assembly.LoadFile(@"c:\a.dll");
//获取刚刚加载的程序集中的所有类型
//assembly.GetType() 等价 typeof(Assembly),不能获取某程序集中的所有类型
//GetType()类获取了所有的类型
//Type[] types = assembly.GetTypes();
//只能获取那些public的类型
//Type[] types = assembly.GetExportedTypes();
//for (int i = 0; i <types.Length; i++)
//{
// Console.WriteLine(types[i].Name );
//}
//只获取Person类的Type
//GetType() 方法有重载 选择第二个重载 参数 表示是要获取的类型的“
//"完全限定名称" 即 :命名空间.类名
//这里拿到了Type,其实就等价于typeof(Person) 或者是:p.GetType()
Type personType = assembly.GetType("_TestDll.Person");
//获取所有的方法 :personType.GetMethods()*
//获取某个特定的方法(根据方法名):personType.GetMethod();
#region 调用无参数的构造方法
// MethodInfo method= personType.GetMethod("SayHi");
// //通过反射来创建一个person类型的对象{其实就是通过Person的Type来创建一个
// //Person对象}
//object objPerson = Activator.CreateInstance(personType);
// //调用这个方法
// //这个是无参数无返回值的参数
//method.Invoke(objPerson,null );
#endregion
#region 调用带参数 带返回值的方法
//调用带参数 带返回值的方法
////1>找到对应的方法
//MethodInfo method = personType.GetMethod("Add");
//object obj = Activator.CreateInstance(personType);
////2>调用
//object result = method.Invoke(obj,new object[]{10,200});
//Console.WriteLine("调用Add方法的返回值结果是:{0}",result);
#endregion
#region 调用带重载的方法
//1>找到对应的方法
//MethodInfo method = personType.GetMethod("Add", new Type[] { typeof(int), typeof(int), typeof(int) });
//object obj = Activator.CreateInstance(personType);
////调用
//int r = (int)method.Invoke(obj,new object[]{1,2,3});
//Console.WriteLine(r);
#endregion
#region 通过反射获取类的属性 并赋值
////1获取属性
//PropertyInfo property = personType.GetProperty("Name");
//object obj = Activator.CreateInstance(personType);
////2为属性赋值
//property.SetValue(obj,"王健",null);
////3获取属性
////string name = property.GetValue(obj,null ).ToString();
////Console.WriteLine(name);
#endregion
#region 手动查找类型的构造函数 并且调用该构造函数来创建类型的对象
// //找到对应的构造函数 但是还没有调用
//ConstructorInfo ctor = personType.GetConstructor(new Type[] { typeof(string), typeof(int ) });
// //开始调用构造函数
//object obj = ctor.Invoke(new object[]{"hpp",16});
//Console.WriteLine(obj.ToString());
#endregion
#region 其他的反射中的一些方法
///动态加载一个程序集
//获取Person的Type
Type typePerson = assembly.GetType("_02TestDll.Person");
Type typeStudent = assembly.GetType("_02TestDll.Student");
Type typeFlayable = assembly.GetType("_02TestDll.IFlyable");
#region //bool IsAssignableFrorm(Type c):(直译:是否可以从c赋值)
//判断当前的类型的变量是不是可以接受c类型的赋值
//Student 是 Person的子类 所以这返回的是true
//bool b = typePerson.IsAssignableFrom(typeStudent);
//Console.WriteLine(b);
#endregion
#region bool IsInstanceOfType (object o) :判断对象o 是否是当前的实例
//(当前类可以是o 的类 父类 接口)
////Person
//object objPerson = Activator.CreateInstance(typePerson);
////Student
//object objStudent = Activator.CreateInstance(typeStudent);
//bool b = typePerson.IsInstanceOfType(objPerson);//true
//Console.WriteLine(b);
#endregion
#region bool IsSubclassof(Type c):判断当前类是类是否是c的子类
bool b = typeStudent.IsSubclassOf(typeFlayable);
Console.WriteLine(b);
#endregion
#region IsAbstract 判断是否为抽象的 含接口
Console.WriteLine(typePerson.IsAbstract);//false
#endregion
#endregion
Console.ReadKey();
#endregion
}
{
#region 反射介绍
//反射:通过动态获取程序集 获取其中的类型元数据 然后访问类型的过程
//反射中一个非常重要的类型就是Type
//1.如果获取Type类型的对象?
//获取Person类型的Type 对象 Type 对象中就是存放了一些关于某个类型的所有的信息的内容
//
//1>当没有对象的时候使用这种方式获取某个类型的Type
//Type type =typeof(Person);
//2>//当获得对象后就可以使用对象的GetType() 方法来获取指定对象的类型的Type对象
//Person p=new Person();
//Type personType = p.GetType();
////2.获取Person类中的所有的方法
//MethodInfo[] methods = personType.GetMethods();
////methods这个变量中存储了Person类中的所有的方法
////遍历输出每个方法的方法名
//for (int i = 0; i < methods.Length; i++)
//{
// //通过Type对象的GetMethods() 可以获取指定类型的所有的方法其中包括编译器自动
// //自动生成的以及从父类中继承来的方法 但是不包含private方法 需要使用其他方式
// Console.WriteLine(methods[i].Name);
//}
//Console.ReadKey();
// //3.获取某个类型的所有属性
//PropertyInfo[] properties= personType.GetProperties();
//for (int i = 0; i < properties.Length; i++)
//{
// Console.WriteLine(properties[i].Name);
//}
//获取类中所有字段
//FieldInfo[] fields = personType.GetFields();
//for (int i = 0; i < fields.Length; i++)
//{
// Console.WriteLine(fields[i].Name);
//}
// Console.ReadKey();
#endregion
#region 反射获取另外一个程序集中类型
//Assembly
//动态加载一个程序集
Assembly assembly = Assembly.LoadFile(@"c:\a.dll");
//获取刚刚加载的程序集中的所有类型
//assembly.GetType() 等价 typeof(Assembly),不能获取某程序集中的所有类型
//GetType()类获取了所有的类型
//Type[] types = assembly.GetTypes();
//只能获取那些public的类型
//Type[] types = assembly.GetExportedTypes();
//for (int i = 0; i <types.Length; i++)
//{
// Console.WriteLine(types[i].Name );
//}
//只获取Person类的Type
//GetType() 方法有重载 选择第二个重载 参数 表示是要获取的类型的“
//"完全限定名称" 即 :命名空间.类名
//这里拿到了Type,其实就等价于typeof(Person) 或者是:p.GetType()
Type personType = assembly.GetType("_TestDll.Person");
//获取所有的方法 :personType.GetMethods()*
//获取某个特定的方法(根据方法名):personType.GetMethod();
#region 调用无参数的构造方法
// MethodInfo method= personType.GetMethod("SayHi");
// //通过反射来创建一个person类型的对象{其实就是通过Person的Type来创建一个
// //Person对象}
//object objPerson = Activator.CreateInstance(personType);
// //调用这个方法
// //这个是无参数无返回值的参数
//method.Invoke(objPerson,null );
#endregion
#region 调用带参数 带返回值的方法
//调用带参数 带返回值的方法
////1>找到对应的方法
//MethodInfo method = personType.GetMethod("Add");
//object obj = Activator.CreateInstance(personType);
////2>调用
//object result = method.Invoke(obj,new object[]{10,200});
//Console.WriteLine("调用Add方法的返回值结果是:{0}",result);
#endregion
#region 调用带重载的方法
//1>找到对应的方法
//MethodInfo method = personType.GetMethod("Add", new Type[] { typeof(int), typeof(int), typeof(int) });
//object obj = Activator.CreateInstance(personType);
////调用
//int r = (int)method.Invoke(obj,new object[]{1,2,3});
//Console.WriteLine(r);
#endregion
#region 通过反射获取类的属性 并赋值
////1获取属性
//PropertyInfo property = personType.GetProperty("Name");
//object obj = Activator.CreateInstance(personType);
////2为属性赋值
//property.SetValue(obj,"王健",null);
////3获取属性
////string name = property.GetValue(obj,null ).ToString();
////Console.WriteLine(name);
#endregion
#region 手动查找类型的构造函数 并且调用该构造函数来创建类型的对象
// //找到对应的构造函数 但是还没有调用
//ConstructorInfo ctor = personType.GetConstructor(new Type[] { typeof(string), typeof(int ) });
// //开始调用构造函数
//object obj = ctor.Invoke(new object[]{"hpp",16});
//Console.WriteLine(obj.ToString());
#endregion
#region 其他的反射中的一些方法
///动态加载一个程序集
//获取Person的Type
Type typePerson = assembly.GetType("_02TestDll.Person");
Type typeStudent = assembly.GetType("_02TestDll.Student");
Type typeFlayable = assembly.GetType("_02TestDll.IFlyable");
#region //bool IsAssignableFrorm(Type c):(直译:是否可以从c赋值)
//判断当前的类型的变量是不是可以接受c类型的赋值
//Student 是 Person的子类 所以这返回的是true
//bool b = typePerson.IsAssignableFrom(typeStudent);
//Console.WriteLine(b);
#endregion
#region bool IsInstanceOfType (object o) :判断对象o 是否是当前的实例
//(当前类可以是o 的类 父类 接口)
////Person
//object objPerson = Activator.CreateInstance(typePerson);
////Student
//object objStudent = Activator.CreateInstance(typeStudent);
//bool b = typePerson.IsInstanceOfType(objPerson);//true
//Console.WriteLine(b);
#endregion
#region bool IsSubclassof(Type c):判断当前类是类是否是c的子类
bool b = typeStudent.IsSubclassOf(typeFlayable);
Console.WriteLine(b);
#endregion
#region IsAbstract 判断是否为抽象的 含接口
Console.WriteLine(typePerson.IsAbstract);//false
#endregion
#endregion
Console.ReadKey();
#endregion
}
发表评论
-
xml学习
2015-05-29 21:15 642namespace xml学习 { class Pro ... -
用反射给触发器添加功能
2015-05-28 18:15 403using System; using System.Coll ... -
list集合中进行排序
2015-05-27 13:21 749namespace list集合中的排序方法 { cl ... -
用接口和委托两种方式实现用户登录
2015-05-27 12:24 599------------------------------- ... -
sqlHelper
2015-04-22 17:33 486using System; using System.Coll ... -
ado.net实现分页和用dataadapter实现增加修改删除
2015-04-22 16:19 865using System; using System.Coll ... -
用dom的形式访问xml文档一
2014-06-11 21:06 614xml文档: <items> < ... -
XmlTextWriter生成xml文件
2014-06-11 20:36 791XmlTextWriter writer = new XmlT ... -
C#中的listview绑定 xml文件中的数据并显示
2014-06-11 19:57 1768xml:文件内容 <?xml version=" ... -
repeater控件实现数据绑定并分页
2015-05-28 13:51 939前台:添加一个Repeater 控件 四个LinkButton ... -
.net中在后台代码中构建html代码在前台显示
2014-06-08 20:06 1038目的:从数据库中查出一个表,将表中的name列的值,用表格的形 ... -
C#中null和""的区别
2013-07-18 16:14 589string str = null 没有创建内存空间,str中 ... -
[DllImport("user32.dll")]
2013-07-17 18:19 1381这叫引入user32.dll这个动态连接库。 这个动态连接库里 ... -
解决方案资源管理器中显示bin,Debug等文件夹
2013-07-17 17:09 8531.项目 -- 显示所有文件 2.右击新出现的bin,De ... -
c#编码规范
2013-07-16 19:11 5031.命名规范 (1)所有的函数(变量/类/文件名)应该代表其实 ... -
C# 中 PictureBox 加载图片后无法删除解决方法 .
2013-06-13 23:42 1874PictureBox加载图片后,再 ... -
wiform中获取当编写代码右侧可以看见的文件夹的路径的方法
2013-06-06 17:45 627这个原理是先获取根目录之后再利用字 ... -
对xml文档的一些基本操作主要代码
2013-06-01 00:45 792using System; using System.Coll ... -
不同的Form窗体中传值方法
2013-03-20 23:45 877第一个方法设全局变量: 双向传值,也就是说,form1和fo ... -
用vs建网站是添加一个网站启动的快捷方式
2012-11-08 00:17 691首先建一个网站 -然后左击一下解决方案 -点击左上角的文件在下 ...
相关推荐
0.0.0 VScode插件platformIO开发环境的安装[esp32、8266]_̌萌新历险记的博客-CSDN博客.mhtml
五一数学建模
人工智能大模型体验报告3.0 目录 大模型产品测评综述 大模型产品现状与进程 3 .0版本大模型测评规则 大模型厂商整体测评 3.0版本大模型综合指数 3.0版本 测评细分维度指数及评述 测评题目展示 厂商最佳实践案例 厂商优秀案例展示 人工 智能大模型体验报告3.0.pdf (1.39 MB, 需要: RMB 9 元)
使用opencv进行人脸识别和对比-python源码.zip
触屏版自适应手机wap软件网站模板 触屏版自适应手机wap软件网站模板
基于matlab实现的GST模型的红外弱小目标检测代码.rar
LMDI(对数平均迪氏指数法)目前在能源消耗、碳排放等领域应用很多,总体来说并不 是一个很难的方法,但是相应的资料、步骤还是比较少。本人在写论文的时候,通过搜集资 料、研究,找到了stata的实现方法,来自于 Kerry Du老师写的一个模块l dmi,网址为: LMDI: Stata module to compute L ogarithmic Mean Divisia Index (LMDI) Dec omposition (repec.org) 大家可以自己去研究一下。对应的参考 文献就是Ang, B.W., 2005. The LMDI approach t odecomposition analysis: a practical gui de. Energy Policy 33, 867–871. 目前LMDI分解基 本都以这篇文献为参考,论坛里也有,大家可以下载去深入研究一下,总体并不难。 但是 对于LMDI方法的解读以及stata实现的步骤、过程,目前基本没有具体的中文资料 。 本文在写论文的过程中,进行了总结,现上传上来供大家参考,里面包括stata的 程序文件(ado
IEC 60695-11-2-2017 第11-2部分:试验火焰——1kW标称预混合火焰——装置、验证试验安排和指南.pdf
基于matlab实现的拉普拉斯金字塔分解 做毕业设计的可以参考,小波变换以及MGA的初级参考.rar
本文档是课题研究的研究报告内含调研以及源码设计以及结果分析
Node.js,简称Node,是一个开源且跨平台的JavaScript运行时环境,它允许在浏览器外运行JavaScript代码。Node.js于2009年由Ryan Dahl创立,旨在创建高性能的Web服务器和网络应用程序。它基于Google Chrome的V8 JavaScript引擎,可以在Windows、Linux、Unix、Mac OS X等操作系统上运行。 Node.js的特点之一是事件驱动和非阻塞I/O模型,这使得它非常适合处理大量并发连接,从而在构建实时应用程序如在线游戏、聊天应用以及实时通讯服务时表现卓越。此外,Node.js使用了模块化的架构,通过npm(Node package manager,Node包管理器),社区成员可以共享和复用代码,极大地促进了Node.js生态系统的发展和扩张。 Node.js不仅用于服务器端开发。随着技术的发展,它也被用于构建工具链、开发桌面应用程序、物联网设备等。Node.js能够处理文件系统、操作数据库、处理网络请求等,因此,开发者可以用JavaScript编写全栈应用程序,这一点大大提高了开发效率和便捷性。 在实践中,许多大型企业和组织已经采用Node.js作为其Web应用程序的开发平台,如Netflix、PayPal和Walmart等。它们利用Node.js提高了应用性能,简化了开发流程,并且能更快地响应市场需求。
制造企业数字化转型ERP与CRM系统集成定位及场景构建方案.pptx
触屏版自适应手机wap软件网站模板 触屏版自适应手机wap软件网站模板
【课程设计全套资料】基于JAVA的管理系统
IEC 60730-2-13-2017.pdf
机械设计谷物洗涤机sw12非常好的设计图纸100%好用.zip
2000—2022年东中西分区域空间权重矩阵,省级层面,具体包括01矩阵,经济矩 阵,地理矩阵,经济地理矩阵以及经济地理嵌套矩阵,包含原始数据和计算过程,经济地理 权重矩阵采用2000-2022年数据,可以更改研究期间,里面有计算过程,地理距离 是用的欧式距离,如有疑问可与我私聊哈,大家放心下载。
TMCM-0930-TMCL 硬件手册
软件说明:先将要合并的.PDF类型文件放到一个文件夹里,然后点击”选择文件夹“选择它,再点击合并,确定存放位置确定后即可成功合并一个PDF类型的文件。在 Python 中,可以使用 PyPDF2 库来合并 PDF 文件。用 pip install PyPDF2 命令来安装这个库。
一、最短路径的概念及应用 在介绍最短路径之前我们首先要明白两个概念:什么是源点,什么是终点?在一条路径中,起始的第 一个节点叫做源点;终点:在一条路径中,最后一个的节点叫做终点;注意!源点和终点都只是相对 于一条路径而言,每一条路径都会有相同或者不相同的源点和终点。 而最短路径这个词不用过多解释,就是其字面意思: 在图中,对于非带权无向图而言, 从源点到终点 边最少的路径(也就是 BFS 广度优先的方法); 而对于带权图而言, 从源点到终点权值之和最少的 路径叫最短路径; 最短路径应用:道路规划; 我们最关心的就是如何用代码去实现寻找最短路径, 通过实现最短路径有两种算法:Dijkstra 迪杰斯 特拉算法和 Floyd 弗洛伊德算法, 接下来我会详细讲解 Dijkstra 迪杰斯特拉算法;