C# 基础知识-反射
一.反射
1>反射的命名空间是System.Reflection
2>是.Net框架提供的帮助类库,读取并使用matedata
二.反射基本用法
举例如下
1>Assembly assembly Assembly.Load("DB.MySql");//1.反射加载DLL (DLL名称是DB.MySql),用Assembly动态加载程序集
2>Type type = assembly.GetType("DB.MySql.MySqlHelper");//2.获取类型信息(命名空间+类名 :DB.MySql+MySqlHelper)
3>object oDBHelper = Activator.CreateInstance(type);//3. 用Activator创建对象
4>IDBHelper iDBHelper = (IDBHelper)oDBHelper;//4 类型转换,把object对象oDBHelper,通过强制转换为接口IDBHelper
5>iDBHelper.Query();//5 方法调用,传建好了接口对象iDBHelper,调用方法Query()
三.反射用在哪里
主流框架MVC,IOC,ORM和DOT模型都在用反射,反射最主要的特点就是“动态”
1>IOC(IOC=简单工厂+配置文件+反射)
-之前调用dll,都是先引用dll,添加命名空间,然后创建对象。现在可以动态加载dll,动态获取类型,动态创建对象。
IDBHelper iDBHeler = Factory.CreateHelper();//Factory工厂主要作用是创建对象
iDBHeler.Query();//可以调用对象的方法了,反射是动态的 依赖的是字符串
1 /// <summary>
2 /// 创建对象
3 /// </summary>
4 public class Factory
5 {
6 private static string IDBHelperConfig = ConfigurationManager.AppSettings["IDBHelperConfig"];
7 private static string DllName = IDBHelperConfig.Split(',')[1];
8 private static string TypeName = IDBHelperConfig.Split(',')[0];
9
10
11 public static IDBHelper CreateHelper()//1 2
12 {
13 Assembly assembly = Assembly.Load(DllName);//1 加载dll ,从当前目录下加载的
14 Type type = assembly.GetType(TypeName);//2 获取类型信息
15 object oDBHelper = Activator.CreateInstance(type);//3 创建对象,跟new一个对象是一样的,都是调用无参数的构造函数
16 IDBHelper iDBHelper = (IDBHelper)oDBHelper;//4 类型转换
17 return iDBHelper;
18 }
19 }
2>MVC(主要是通过反射,调用方法)
MVC是通过反射,创建对象,然后通过方法名称,达到调用方法的目的
1 //MVC 类名称+方法名称 3
Assembly assembly = Assembly.Load("DB.SqlServer");
4 Type type = assembly.GetType("DB.SqlServer.ReflectionTest");
5 object oReflectionTest = Activator.CreateInstance(type);
6 {
7 MethodInfo method = type.GetMethod("Show4", BindingFlags.Instance | BindingFlags.NonPublic);//Show4的访问修饰符是Private
8 method.Invoke(oReflectionTest, new object[] { "4" });
9 }
10 {
11 MethodInfo method = type.GetMethod("Show1");//调用无参数方法
12 method.Invoke(oReflectionTest, null);
13 }
14 {
15 MethodInfo method = type.GetMethod("Show2");//调用有参数方法(拿int举例)
16 method.Invoke(oReflectionTest, new object[] { 123 });
17 }
18 {
19 MethodInfo method = type.GetMethod("Show5");
20 method.Invoke(oReflectionTest, new object[] { "麦田的稻草人" });//调用静态方法,Show5是静态方法,第一个object对象传入不传入都可以
21 method.Invoke(null, new object[] { "果然" });
22 }
23 {
24 MethodInfo method = type.GetMethod("Show3", new Type[] { });//调用重载方法,Show3是重载方法
25 method.Invoke(oReflectionTest, new object[] { });
26 }
27 {
28 MethodInfo method = type.GetMethod("Show3", new Type[] { typeof(int) });
29 method.Invoke(oReflectionTest, new object[] { 123 });
30 }
31 {
32 MethodInfo method = type.GetMethod("Show3", new Type[] { typeof(string) });
33 method.Invoke(oReflectionTest, new object[] { "Ant" });
34 }
35 {
36 MethodInfo method = type.GetMethod("Show3", new Type[] { typeof(int), typeof(string) });
37 method.Invoke(oReflectionTest, new object[] { 234, "W" });
38 }
39 {
40 MethodInfo method = type.GetMethod("Show3", new Type[] { typeof(string), typeof(int) });
41 method.Invoke(oReflectionTest, new object[] { "W", 234 });
42 }
下面这个类,是反射测试类
1 /// <summary>
2 /// 反射测试类
3 /// </summary>
4 public class ReflectionTest
5 {
6 #region Identity
7 /// <summary>
8 /// 无参构造函数
9 /// </summary>
10 public ReflectionTest()
11 {
12 Console.WriteLine("这里是{0}无参数构造函数", this.GetType());
13 }
14
15 /// <summary>
16 /// 带参数构造函数
17 /// </summary>
18 /// <param name="name"></param>
19 public ReflectionTest(string name)
20 {
21 Console.WriteLine("这里是{0} 有参数构造函数", this.GetType());
22 }
23
24 public ReflectionTest(int id)
25 {
26 Console.WriteLine("这里是{0} 有参数构造函数", this.GetType());
27 }
28 #endregion
29
30 #region Method
31 /// <summary>
32 /// 无参方法
33 /// </summary>
34 public void Show1()
35 {
36 Console.WriteLine("这里是{0}的Show1", this.GetType());
37 }
38 /// <summary>
39 /// 有参数方法
40 /// </summary>
41 /// <param name="id"></param>
42 public void Show2(int id)
43 {
44
45 Console.WriteLine("这里是{0}的Show2", this.GetType());
46 }
47 /// <summary>
48 /// 重载方法之一
49 /// </summary>
50 /// <param name="id"></param>
51 /// <param name="name"></param>
52 public void Show3(int id, string name)
53 {
54 Console.WriteLine("这里是{0}的Show3", this.GetType());
55 }
56 /// <summary>
57 /// 重载方法之二
58 /// </summary>
59 /// <param name="name"></param>
60 /// <param name="id"></param>
61 public void Show3(string name, int id)
62 {
63 Console.WriteLine("这里是{0}的Show3_2", this.GetType());
64 }
65 /// <summary>
66 /// 重载方法之三
67 /// </summary>
68 /// <param name="id"></param>
69 public void Show3(int id)
70 {
71
72 Console.WriteLine("这里是{0}的Show3_3", this.GetType());
73 }
74 /// <summary>
75 /// 重载方法之四
76 /// </summary>
77 /// <param name="name"></param>
78 public void Show3(string name)
79 {
80
81 Console.WriteLine("这里是{0}的Show3_4", this.GetType());
82 }
83 /// <summary>
84 /// 重载方法之五
85 /// </summary>
86 public void Show3()
87 {
88
89 Console.WriteLine("这里是{0}的Show3_1", this.GetType());
90 }
91 /// <summary>
92 /// 私有方法
93 /// </summary>
94 /// <param name="name"></param>
95 private void Show4(string name)
96 {
97 Console.WriteLine("这里是{0}的Show4", this.GetType());
98 }
99 /// <summary>
100 /// 静态方法
101 /// </summary>
102 /// <param name="name"></param>
103 public static void Show5(string name)
104 {
105 Console.WriteLine("这里是{0}的Show5", typeof(ReflectionTest));
106 }
107 #endregion
108 }
3>ORM(通过反射,调用属性和字段或者设置属性的值)
1 People people = new People();
2 people.Id = 123;
3 people.Name = "Look";
4 people.Description = "二年级学生";
5 {
6 Type typePeople = typeof(People);
7 Type typePeopleDTO = typeof(PeopleDTO);
8 object peopleDTO = Activator.CreateInstance(typePeopleDTO);
9 foreach (var prop in typePeopleDTO.GetProperties())
10 {
11 object value = typePeople.GetProperty(prop.Name).GetValue(people);
12 prop.SetValue(peopleDTO, value);
13 }
14 foreach (var filed in typePeopleDTO.GetFields())
15 {
16 object value = typePeople.GetField(filed.Name).GetValue(people);
17 filed.SetValue(peopleDTO, value);
18 }
19 }
下面是people实体类
1 /// <summary>
2 /// 实体
3 /// </summary>
4 public class People
5 {
6 public People()
7 {
8 Console.WriteLine("{0}被创建", this.GetType().FullName);
9 }
10
11 public int Id { get; set; }
12 public string Name { get; set; }
13 public string Description;
14 }
15
16 public class PeopleDTO
17 {
18 public PeopleDTO()
19 {
20 Console.WriteLine("{0}被创建", this.GetType().FullName);
21 }
22 public int Id { get; set; }
23 public string Name { get; set; }//ShortName 特性
24
25 public string Description;
26 }
27 }
C# 基础知识-反射的更多相关文章
- JAVA基础知识|反射
一.理解反射 1.1.基础概念 反射:在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法:对于任意一个对象,都能够调用它的任意方法和属性:这种动态获取信息以及动态调用对象方法的功能称为ja ...
- 【读书笔记】Java核心技术-基础知识-反射
在网页中运行Java程序称为applet. 反射 这项功能被大量地应用于JavaBeans中,它是Java组件的体系结构. 能够分析类能力的程序称为反射(reflective).反射机制的功能及其强大 ...
- C#基础知识回顾-- 反射(3)
C#基础知识回顾-- 反射(3) 获取Type对象的构造函数: 前一篇因为篇幅问题因为篇幅太短被移除首页,反射这一块还有一篇“怎样在程序集中使用反射”, 其他没有什么可以写的了,前两篇主要是铺垫, ...
- C#基础知识回顾-- 反射(1)
C#基础知识回顾-- 反射(1) 反射(reflection)是一种允许用户获得类型信息的C#特性.术语“反射”源自于它的工作方式: Type对象映射它所代表的底层对象.对Type对象进行查询可以 ...
- 学习Spring必学的Java基础知识(1)----反射(转)
引述要学习Spring框架的技术内幕,必须事先掌握一些基本的Java知识,正所谓"登高必自卑,涉远必自迩".以下几项Java知识和Spring框架息息相关,不可不学(我将通过一个系 ...
- 学习Spring必学的Java基础知识(1)----反射
引述要学习Spring框架的技术内幕,必须事先掌握一些基本的Java知识,正所谓"登高必自卑,涉远必自迩".以下几项Java知识和Spring框架息息相关,不可不学(我将通过一个系 ...
- Java开发培训基础知识解析之反射机制
Java是老牌编程语言,是当前应用最广泛的编程语言之一.想要学习Java你就一定要掌握Java基础知识,而反射对于初学Java的人来说绝对是非常重要的知识点.什么是反射?如何理解反射机制?如何使用反射 ...
- 使用Code First建模自引用关系笔记 asp.net core上使用redis探索(1) asp.net mvc控制器激活全分析 语言入门必学的基础知识你还记得么? 反射
使用Code First建模自引用关系笔记 原文链接 一.Has方法: A.HasRequired(a => a.B); HasOptional:前者包含后者一个实例或者为null HasR ...
- java Reflection(反射)基础知识讲解
原文链接:小ben马的java Reflection(反射)基础知识讲解 1.获取Class对象的方式 1.1)使用 "Class#forName" public static C ...
随机推荐
- 为什么不建议给MySQL设置Null值?《死磕MySQL系列 十八》
大家好,我是咔咔 不期速成,日拱一卒 之前ElasticSearch系列文章中提到了如何处理空值,若为Null则会直接报错,因为在ElasticSearch中当字段值为null时.空数组.null值数 ...
- python读写excel表格,4泼水板房
import shutilimport osfrom openpyxl import load_workbookfrom xlutils.copy import copyimport win32com ...
- 并发编程之volatile与JMM多线程内存模型
一.通过程序看现象 在开始为大家讲解Java 多线程缓存模型之前,我们先看下面的这一段代码.这段代码的逻辑很简单:主线程启动了两个子线程,一个线程1.一个线程2.线程1先执行,sleep睡眠2秒钟之后 ...
- 204. Count Primes - LeetCode
Queston 204. Count Primes Solution 题目大意:给一个数,求小于这个数的素数的个数 思路:初始化一个boolean数组,初始设置为true,先遍历将2的倍数设置为fal ...
- 【单片机】CH32V103C8T6定时器3程序实验
代码功能:每隔1毫秒进入一次定时器中断. 每隔1秒串口打印一次数据. time.c #include "time.h" #include "ch32v10x.h" ...
- Python模块Ⅰ
Python模块Ⅰ part1 模块的定义/取别名 自定义模块 什么是模块:模块的本质就是.py文件,封装语句的最小单位 模块中出现的变量,for循环,if结构,函数定义...称为模块成员 模块的运行 ...
- 且看这个Node全栈框架,实现了个Cli终端引擎,可无限扩充命令集
背景介绍 一般而言,大多数框架都会提供Cli终端工具,用于通过命令行执行一些工具类脚本 CabloyJS提供的Cli终端工具却与众不同.更确切的说,CabloyJS提供的是Cli终端引擎,由一套Cli ...
- ExtJS 布局-Card 布局(Card layout)
更新记录: 2022年6月1日 开始. 2022年6月6日 发布. 1.说明 卡片布局类似牌堆,每次只有一个子组件可见,子组件几乎填满了整个容器.卡片布局常用于向导(Wizard)和选项卡(Tabs) ...
- Redis之Lua的应用(四)
一.什么是Lua脚本 Lua是一个高效的轻量级脚本语言(和JavaScript类似),用标准C语言编写并以源代码形式开放, 其设计目的是为了嵌入应用程序中,从而为应用程序提供灵活的扩展和定制功能.Lu ...
- Canal实现MySQL协议
目录 代码流程 执行dump前 执行dump 在学习Canal的时候很好奇Canal是如何模拟成MySql Slave来接收数据的 MySql Slave会向主库发送dump协议来接收bin-log数 ...