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 ...
随机推荐
- SpringBoot从0到0.7——第四天
SpringBoot从0到0.7--第四天 今天进行实战开发一个小项目,SpringBoot和Thymeleaf集成的小项目 因为懒得写写前端,直接找的别人的项目在它的的基础上进行配置,进行修改.gi ...
- 探索 Python/Django 支持分布式多租户数据库,如 Postgres+Citus
在 确定分布策略 中,我们讨论了在多租户用例中使用 Citus 所需的与框架无关的数据库更改. 在这里,我们专门研究如何借助 django-multitenant 库将多租户 Django 应 用程序 ...
- 【python】python连接Oracle数据库
python连接Oracle数据库 查看Oracle版本 select * from v$version 下载对应版本的InstantClient 下载网址 InstantClient 1.解压Ins ...
- 使用instanceof操作符判断对象类型及方法的重载
学习内容: 一.使用instanceof操作符判断对象类型 1.instanceof操作符可以判断一个实例对象是否属于一个类. 语法:对象名 instanceof 类名 2.使用instanceof表 ...
- OI中组合数学公式和定理90%歼灭
组合数学 基础概念 加法和乘法原理 加法原理 同一步下的不同选择,可以通过累加得到方案数. 乘法原理 整个流程的方案数可以由每一步的方案数相乘得到. 有了加法原理和乘法原理,就可以解决一些没有选择导致 ...
- Public Round #1
传送门 [PR #1]删数 题意:写的很清楚了,略 思路: 首先转化为差分数组,两个连续数相同,删掉,乘二放进去. 发现能互相转化的两个数,符号,值\(/lowbit\)都一样. 把能相互转化的数归为 ...
- Oracle数据库丢失表排查思路
Oracle数据库丢失表排查思路 说明:由于系统采用ID取模分表法进行Oracle数据存储,某日发现Oracle数据库中缺少对应的几张业务数据表,遂进行相关问题查询,简单记录一下排查思路: 由于我们代 ...
- JS:三目运算符
语法:条件表达式?表达式1:表达式0 注:当条件表达式为true则选择表达式1,反之false则选择表达式0 例: var a = 0; var b = 1; re=a>b?a:b consol ...
- SAP Column tree
code as bellow *&---------------------------------------------------------------------* *& I ...
- Java多线程下载分析
为什么要多线程下载 俗话说要以终为始,那么我们首先要明确多线程下载的目标是什么,不外乎是为了更快的下载文件.那么问题来了,多线程下载文件相比于单线程是不是更快? 对于这个问题可以看下图. 横坐标是线程 ...