反射

放射是指在程序运行时动态的获取类的信息的机制,我们下面来看看C#中的反射。

Type

Type 为 System.Reflection 功能的根,也是访问元数据的主要方式。 使用 Type 的成员获取关于类型声明的信息,如构造函数、方法、字段、属性 (Property) 和类的事件,以及在其中部署该类的模块和程序集。

我们获取一个指定类型的Type有三种方法:

  1. 通过typeof直接获取;
  2. 通过调用GetType方法获取;
  3. 通过调用Type的静态方法GetType获取;

这三个方法都可以获取指定类型的Type对象,但是也有一点区别,具体可以参考下面两篇博客:

http://www.studyofnet.com/news/284.html

http://blog.csdn.net/letianok/article/details/7257117

下面我们来看一个例子:

 1 using System;
 2
 3 namespace Study
 4 {
 5     class Program
 6     {
 7         static void Main(string[] args)
 8         {
 9             Type t1 = typeof(string);
10             Console.WriteLine(t1.FullName);
11             //System.String
12
13             Type t2 = "hello type!".GetType();
14             Console.WriteLine(t2.FullName);
15             //System.String
16
17             Type t3 = Type.GetType("System.String", false);
18             Console.WriteLine(t3.FullName);
19             //System.String
20
21             Console.Read();
22         }
23     }
24 }

获取类的信息

我们可以通过Type类型获取到类的所有信息,比如我们要获取类的所有方法信息的话,可以使用下面的代码:

 1 using System;
 2 using System.Reflection;
 3
 4 namespace Study
 5 {
 6     class Program
 7     {
 8         static void Main(string[] args)
 9         {
10             string str = "Hello Type!";
11
12             Type t = str.GetType();
13             //获取所有方法信息
14             MethodInfo[] methodInfos = t.GetMethods();
15             for (int i = 0; i < methodInfos.Length; i++)
16             {
17                 Console.WriteLine(methodInfos[i].Name);
18             }
19             //仅获取非静态的公共方法信息
20             methodInfos = t.GetMethods(BindingFlags.Instance | BindingFlags.Public);
21             for (int i = 0; i < methodInfos.Length; i++)
22             {
23                 Console.WriteLine(methodInfos[i].Name);
24             }
25
26             Console.Read();
27         }
28     }
29 }

更多信息的获取方法可以参考帮助文档(https://msdn.microsoft.com/zh-cn/library/system.type(v=vs.110).aspx)。

调用指定的方法

下面我们看看如何获取一个类的指定方法并进行调用:

 1 using System;
 2 using System.Reflection;
 3
 4 namespace Study
 5 {
 6     class Program
 7     {
 8         static void Main(string[] args)
 9         {
10             string str = "Hello Type!";
11
12             Type t = str.GetType();
13             //对于存在多个重载的方法需要指明参数的类型
14             MethodInfo method = t.GetMethod("Split", new []{typeof(char[])});
15             //调用方法
16             string[] strs = method.Invoke(str, new object[] {new[] {' '}}) as string[];
17             for (int i = 0; i < strs.Length; i++)
18             {
19                 Console.WriteLine(strs[i]);
20             }
21
22             Console.Read();
23         }
24     }
25 }

Assembly

程序集可以看做一个或多个DLL或EXE文件的集合,可以通过程序集将重复的代码提取出来,可以重复使用。

我们首先创建一个类库项目,代码如下:

 1 namespace StudyLib
 2 {
 3     public class MyClass
 4     {
 5         public int Add(int a, int b)
 6         {
 7             return a + b;
 8         }
 9
10         public int Add(int a, int b, int c)
11         {
12             return a + b + c;
13         }
14     }
15 }

然后点击菜单栏-》生成-》生成XXX,可以获得对应的DLL文件,接下来我们使用Assembly读取DLL并执行其中的方法:

 1 using System;
 2 using System.Reflection;
 3
 4 namespace Study
 5 {
 6     class Program
 7     {
 8         static void Main(string[] args)
 9         {
10             Assembly assembly = Assembly.LoadFrom("E:\\study\\C#\\StudyLib\\StudyLib\\bin\\Debug\\StudyLib.dll");
11
12             //输出所有类型名称
13             Type[] types = assembly.GetTypes();
14             for (int i = 0; i < types.Length; i++)
15             {
16                 Console.WriteLine(types[i].FullName);
17             }
18             //StudyLib.MyClass
19
20             //动态创建类并调用其中的方法
21             Type t = assembly.GetType("StudyLib.MyClass");
22             ConstructorInfo constructor = t.GetConstructor(Type.EmptyTypes);
23             Object myClass = constructor.Invoke(new object[]{});
24
25             MethodInfo method1 = t.GetMethod("Add", new[] {typeof (int), typeof (int)});
26             int result1 = (int)method1.Invoke(myClass, new object[] {100, 123});
27             Console.WriteLine("第一个方法返回: " + result1);
28             //第一个方法返回: 223
29
30             MethodInfo method2 = t.GetMethod("Add", new[] { typeof(int), typeof(int), typeof(int)});
31             int result2 = (int)method2.Invoke(myClass, new object[] { 100, 123, 456 });
32             Console.WriteLine("第二个方法返回: " + result2);
33             //第二个方法返回: 679
34
35             Console.Read();
36         }
37     }
38 }

C#学习笔记(十):反射相关推荐

  1. IOS之学习笔记十五(协议和委托的使用)

    1.协议和委托的使用 1).协议可以看下我的这篇博客 IOS之学习笔记十四(协议的定义和实现) https://blog.csdn.net/u011068702/article/details/809 ...

  2. 吴恩达《机器学习》学习笔记十四——应用机器学习的建议实现一个机器学习模型的改进

    吴恩达<机器学习>学习笔记十四--应用机器学习的建议实现一个机器学习模型的改进 一.任务介绍 二.代码实现 1.准备数据 2.代价函数 3.梯度计算 4.带有正则化的代价函数和梯度计算 5 ...

  3. 吴恩达《机器学习》学习笔记十二——机器学习系统

    吴恩达<机器学习>学习笔记十二--机器学习系统 一.设计机器学习系统的思想 1.快速实现+绘制学习曲线--寻找重点优化的方向 2.误差分析 3.数值估计 二.偏斜类问题(类别不均衡) 三. ...

  4. 吴恩达《机器学习》学习笔记十——神经网络相关(2)

    吴恩达<机器学习>学习笔记十--神经网络相关(2) 一. 代价函数 二. 反向传播算法 三. 理解反向传播算法 四. 梯度检测 五. 随机初始化 1.全部初始化为0的问题 2.随机初始化的 ...

  5. Mr.J-- jQuery学习笔记(十九)--自定义动画实现图标特效

    之前有写过自定义动画Mr.J-- jQuery学习笔记(十八)--自定义动画 这次实现一个小demo 图标特效 页面渲染 <!DOCTYPE html> <html lang=&qu ...

  6. Mr.J-- jQuery学习笔记(十六)--展开和收起动画折叠菜单的实现

    之前写过动画的隐藏与显示:Mr.J-- jQuery学习笔记(十四)--动画显示隐藏 动画隐藏与显示的一个小demo--对联广告:Mr.J-- jQuery学习笔记(十五)--实现页面的对联广告 与动 ...

  7. Mr.J-- jQuery学习笔记(十五)--实现页面的对联广告

    请看之前的:Mr.J-- jQuery学习笔记(十四)--动画显示隐藏 话不多说,直接上demo <!DOCTYPE html> <html lang="en"& ...

  8. kvm虚拟化学习笔记(十)之kvm虚拟机快照备份

    KVM虚拟化学习笔记系列文章列表 ---------------------------------------- kvm虚拟化学习笔记(一)之kvm虚拟化环境安装 http://koumm.blog ...

  9. mysql 临时表 事务_MySQL学习笔记十:游标/动态SQL/临时表/事务

    逆天十三少 发表于:2020-11-12 08:12 阅读: 90次 这篇教程主要讲解了MySQL学习笔记十:游标/动态SQL/临时表/事务,并附有相关的代码样列,我觉得非常有帮助,现在分享出来大家一 ...

  10. ROS学习笔记十二:使用roswtf

    ROS学习笔记十二:使用roswtf 在使用ROS过程中,roswtf工具可以为我们提供ROS系统是否正常工作的检查作用. 注意:在进行下列操作之前,请确保roscore没有运行. 检查ROS是否安装 ...

最新文章

  1. 【Unity3D】 KeyCode 键码
  2. 关于如何防范Ⅱ、Ⅲ类银行结算账户风险
  3. com接口传入、传出字符串的说明和例程
  4. 前端技巧:如何使用nodejs实现举牌人表情包?
  5. c语言 Nimm game算法,尼姆博奕(Nimm Game)
  6. eclipse链接mycat报数据源初始化失败
  7. 【Pytorch神经网络理论篇】 15 过拟合问题的优化技巧(二):Dropout()方法
  8. SaaS软件服务优点全解析
  9. 通过Telnet查询注册服务
  10. 苹果Mac专业的字体管理应用:​​​​RightFont
  11. 【产品】产品经理手册
  12. 【mmdetection3d】——学习配置文件
  13. std::deque的使用
  14. 深入解析互联网协议的原理
  15. [Python从零到壹] 七.网络爬虫之Requests爬取豆瓣电影TOP250及CSV存储
  16. Linux CentOS 6不能使用yum安装命令
  17. 网络安全技术第六章——第一节计算机病毒及其防治(中毒表现、计算机病毒概述、计算机病毒分类、病毒传播路径、计算机病故防治建议、我之前写过一篇这个,有需要的可以去看一下)
  18. java和美利达_JAVA、GIANT、MERIDA、UCC四大厂商破风铝架横评
  19. 51单片机——人体红外感应报警
  20. 山东省农村信用计算机社考试,山东省农村信用社计算机专业考试题

热门文章

  1. NOI 题库 6264
  2. WCF入门(八)---WCF服务绑定
  3. Java NIO 基础
  4. isnan 函数 -javascript1.1
  5. Chapter 1: 使用引用类型
  6. android double值排序,android根据Double类型数据经纬度算出距离再根据距离实现排序功能...
  7. 排序系统 c语言程序设计,c语言程序设计(排序算法).doc
  8. ex.php,Exphp代码走读
  9. linux boot分区作用,Linux和Uboot下eMMC boot分区读写
  10. 护考人机对话用计算机吗,2018护士执业资格考试人机对话怎么考 有什么注意事项...