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 ...
随机推荐
- 超全面!1.5w字总结50个Java经典基础面试题(已根据知识点分类)
大家好,我是fancy. 在面试中将基础问题回答好就是成功的一半. 我总结了50道经典的Java基础面试题,里面包含面试要回答的知识重点,并且我根据知识类型进行了分类,可以说非常全面了. 小伙伴们点赞 ...
- KLOOK客路旅行基于Apache Hudi的数据湖实践
1. 业务背景介绍 客路旅行(KLOOK)是一家专注于境外目的地旅游资源整合的在线旅行平台,提供景点门票.一日游.特色体验.当地交通与美食预订服务.覆盖全球100个国家及地区,支持12种语言和41种货 ...
- Spring Boot 动态修改 log level
引入依赖 <dependency> <groupId>org.springframework.boot</groupId> <artifactId>sp ...
- linux篇-centos7.3配置
Centos7.3防火墙配置 1.查看firewall服务状态 systemctl status firewalld 2.查看firewall的状态 firewall-cmd --state 3.开启 ...
- 自动化测试报告(allure/html)
pytest有两种生成测试报告的方法(html和allure),今天就给大家一一介绍下 html 一.pytest-html基本语法 1.安装:pip install pytest-html 2.查看 ...
- 文件操作(Java)
学习内容:文件操作 1.输入流:InputStream类是字节输入流的抽象类,常用的一些方法有: raed()方法:从输入流中读取数据的下一个字节 reset()方法:将输入指针返回到当 ...
- 编程语言与python与pycharm的下载
目录 编程语言的发展史 编程语言的分类 python解释器 python解释器的下载与安装 环境变量 执行python程序方式 pycharm编辑器 编程语言的发展史 机器语言是最开始的编程语言,之后 ...
- sqlserver2008 数据库中查询存储过程的的创建修改和执行时间,以及比较常见的系统视图和存储过程
因为各种原因数据库中存在大量无用的存储过程,想查询存储过程的最后执行情况,处理长期不使用的存储过程 下面这条语句可以查询存储过程创建 修改和执行的最后时间: SELECT a.name AS 存储过程 ...
- vivo大规模 Kubernetes 集群自动化运维实践
作者:vivo 互联网服务器团队-Zhang Rong 一.背景 随着vivo业务迁移到K8s的增长,我们需要将K8s部署到多个数据中心.如何高效.可靠的在数据中心管理多个大规模的K8s集群是我们面临 ...
- react-router v6对比react-router v5
简述: 1. react-router v6 原生支持typeScript ; 安装方法 npm install react-router-dom@6 2. react-router v ...