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 ...
随机推荐
- C#/VB.NET 在Excel单元格中应用多种字体格式
在Excel中,可对单元格中的字符串设置多种不同样式,通常只需要获取到单元格直接设置样式即可,该方法设置的样式会应用于该单元格中的所有字符.如果需要对单元格中某些字符设置样式,则可以参考本文中的方法. ...
- 2022管家婆工贸版ERP T3 V22.0工厂管理软件单机网络版无限用户免狗软件可定制
管家婆工贸版是一款针对国内中小加工企业开发的管理软件,软件以财务管理为核心,集采购.销售.存货.生产.工资.固定资产.账务管理等模块于一体,对企业的信息进行监控,实现对企业物流.资金流.信息流和生产成 ...
- @ConfigurationProperties(prefix = "server-options") 抛出 SpringBoot Configuration Annotation Processor not configured 错误
说明 spring-boot-configuration-processor 包的作用是自动生成 META-INF/spring-configuration-metadata.json 文件,而这个 ...
- dd-文件系统内容映射
复制文件并对原文件的内容进行转换和格式化处理. 语法 dd [OPTIONS]... 选项 if=filename 指定源文件. of=filename 指定目的文件. ibs=bytes 指定一个块 ...
- Java中如何快捷的创建不可变集合
在Java 9中又新增了一些API来帮助便捷的创建不可变集合,以减少代码复杂度. 本期配套视频:Java 9 新特性:快速定义不可变集合 常规写法 以往我们创建一些不可变集合的时候,通常是这样写的: ...
- webpack基础知识介绍
1.开发模式 开发模式顾名思义就是我们开发代码时使用的模式 webpack默认只处理js文件,对样式是没办法处理的.因此要处理css资源需要引入CSS-loader 处理CSS资源 如果要使用 css ...
- Hadoop进程理解
进程理解 HDFS相关进程理解(NN,DN,SSN) NameNode中存放的是数据文件与元数据的映射信息,数据文件和block快的映射信息,block块和DataNode的映射信息,前两者存放在磁盘 ...
- 附001.Python多版本环境管理
一 环境背景 由于Python的版本过多,且不同版本之间差异性较大.同时又因系统底层需要调用当前版本Python,所以不能随意变更当前系统Python版本.因此,在多版本共存的情况下,Python多环 ...
- 如何写一个全局的 Notice 组件?
下面将会实现这样的效果: 组件动态创建脚本: NotificationBanner.js import Vue from "vue"; import Notice from &qu ...
- Spire.Office激活
更新记录: 2022年5月28日 初始代码便于复用 注意:最多支持到:E-ICEBLUE Spire.Office Platinum v6.10.3 引入命名空间: using Spire.Licen ...