反射为了动态(运行时动态)
原理:读取metadata(?)
 
Assembly assembly = Assembly.Load("TestReflections");//反射的入口 动态加载DLL
 
foreach (Module item in assembly.GetModules()){}//按照命名空间 决定循环次数
//GetTypes() //类型 类的名字
 
优点:
依赖接口完成可配置可扩展
可配置(不需要修改程序,只需要修改配置文件,程序执行不同的行为)
可扩展(动态增加功能)基础可配置实现(同一个父类或者接口)
弊端:
方法调用时参数溢出也能通过编译
更加耗性能
会跳过编译器,准确性由开发者保障
 
1.1反射的使用(依赖接口):
Assembly assembly = Assembly.Load("TestReflections");//反射的入口 动态加载DLL
Type type = assembly.GetType("TestReflection.DBHelper");//基础类的完整名称找出类
object oDb = Activator.CreateInstance(type);//根据类型,创建对象
IDBHelper IDB = (IDBHelper)oDb;//强转类型
IDB.Query();//使用DLL的方法
 
1.2可配置性的实现:
1.2.1配置文件代码如:
<appSettings>
  <add key="TestReflection" value="TestReflection,TestReflection.DBHelper"/>
</appSettings>
//读取配置文件信息
string nameSpace = ConfigurationManager.AppSettings["TestReflection"];
string[] nameSpaceArr = nameSpace.Split(',');
 
Assembly assembly = Assembly.Load(nameSpaceArr[0]);//反射的入口 动态加载DLL
Type type = assembly.GetType(nameSpaceArr[1]);//基础类的完整名称找出类型
object oDb = Activator.CreateInstance(type);//根据类型,创建对象
IDBHelper IDB = (IDBHelper)oDb;//强转类型
IDB.Query();//使用DLL的方法
 
1.3反射的使用(不依赖接口):
Assembly assembly1 = Assembly.Load(nameSpaceArr[0]);//反射的入口 动态加载DLL
Type type1 = assembly.GetType(nameSpaceArr[1]);//基础类的完整名称找出类型 即类
object oObj = Activator.CreateInstance(type);//创建对象
MethodInfo Query = type.GetMethod("Query");//获取指定方法(type.GetMethods();//获取类的所有方法)
调用方法:
1.3.1无参调用:
Query.Invoke(oObj, null);//第一个参数:方法所在的对象 第二个参数指方法参数,详情见下
 
1.3.2有参数的调用
Query.Invoke(oObj, new object[] { 1, "12" });
 
1.3.3方法重载调用方式
MethodInfo QueryInt = type.GetMethod("Query" , new Type[] { typeof(int) });//通过第二个参数定义获取方法的参数类型,来确定获取的是哪个方法
QueryInt.Invoke(oObj , new object[] { 1 });//调用
 
1.3.4破坏私有函数的规则(.net访问修饰符中的private是只能本类中使用,但是通过反射可以破坏这种机制)
MethodInfo QueryPrivate = type.GetMethod("Query", BindingFlags.Instance | BindingFlags.NonPublic);//获取私有方法
 
1.3.5破坏单例模式(单例模式是指类只能实例化一次,即值进入一次无参构造函数。)(在上例中描述了如果破坏private的机制,在这里讲述如何破坏单例模式,即进入两次无参构造函数)
object oObj2 = Activator.CreateInstance(type2,true);//第二个参数如果公共或非公共默认构造函数可以匹配,则为 true;如果只有公共默认构造函数可以匹配,则为 false。
 
第三节:
1.反射获取属性和赋值
2.封装数据库访问层
 
1)反射获取属性和赋值
           //反射获取属性和赋值
            //1)找到类型 (1.加载DLL 2.找到类型 3.创建对象)
            {
                Type type3 = typeof(DBHelper);//使用typeof()找到类型 前提:知道对象类型
                object obj3 = Activator.CreateInstance(type3);//创建对象
                //type3.GetProperties();    //找出type3类型下的所有属性
                foreach (var item in type3.GetProperties())
                {
                    if (item.Name.Equals("ID"))
                        item.SetValue(obj3, 12);//给属性赋值
                    Console.WriteLine("属性名称:{0},值为{1}", item.Name, item.GetValue(obj3));//获取属性信息
                }
                string fileName = string.Join(",", type3.GetProperties().Select(p => string.Format("[{0}]", p.Name)));//将字符串数组按指定字符连接 返回string类型
            }
 
2)封装数据库访问层
实现思路:
1.通过 类型.Name 获取到模型名称(即表名)
2.通过 类型.GetProperties() 获取到所有的属性名称(即列名)
3.通过 String.Join() 方法拼接列字符串
 
注:
实现数据查询的方法是泛型方法,因为不同的表类型不同,所以在调用的时候需要传入类型(表名)
 
理解:
MVC+EF 使用实体查询是 与这个类似

反射学习:(System.Reflection)的更多相关文章

  1. C#反射发出System.Reflection.Emit学习

    一.System.Reflection.Emit概述 Emit,可以称为发出或者产生.与Emit相关的类基本都存在于System.Reflection.Emit命名空间下.反射,我们可以取得形如程序集 ...

  2. 基础命名空间:反射 using System.Reflection

    反射概念:       .Net的应用程序由几个部分:‘程序集(Assembly)’.‘模块(Module)’.‘类型(class)’组成,程序集包含模块 模块包含类型,类型又包含 成员,而反射提供一 ...

  3. 反射基础 System.Reflection

    一.获取程序集Assembly 1.获取当前运行的程序集 System.Reflection.Assembly[] asm = AppDomain.CurrentDomain.GetAssemblie ...

  4. System.Reflection.Emit学习

    C#反射发出System.Reflection.Emit学习 分享: 1 一.System.Reflection.Emit概述 Emit,可以称为发出或者产生.与Emit相关的类基本都存在于Syste ...

  5. 【C#基础】System.Reflection (反射)

    在使用.NET创建的程序或组件时,元数据(metadata)和代码(code)都存储于"自成一体"的单元中,这个单元称为装配件.我们可以在程序运行期间访问这些信息.在System. ...

  6. C# System.Reflection (反射)

    在使用.NET创建的程序或组件时,元数据(metadata)和代码(code)都存储于“自成一体”的单元中,这个单元称为装配件.我们可以在程序运行期间访问这些信息. 在System.Reflectio ...

  7. 利用.NET Core类库System.Reflection.DispatchProxy实现简易Aop

    背景 Aop即是面向切面编程,众多Aop框架里Castle是最为人所知的,另外还有死去的Spring.NET,当然,.NET Core社区新秀AspectCore在性能与功能上都非常优秀,已经逐渐被社 ...

  8. Java反射学习:深入学习Java反射机制

    一.Java反射的理解(反射是研究框架的基础之一) Java反射机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法:对于任意一个对象,都能够调用它的任意一个方法和属性:这种动态获取的 ...

  9. Java反射机制(Reflection)

    Java反射机制(Reflection) 一.反射机制是什么 Java反射机制是程序在运行过程中,对于任意一个类都能够知道这个类的所有属性和方法;对于任意一个对象都能够调用它的任意一个方法和属性,这种 ...

  10. 详解反射->Type.System

    反射先了解 一:system.Type 获取基本信息: Type.Name   //类名 Type.FullName //完整路径 Type.Namespace //空间名 public class ...

随机推荐

  1. GIT / SVN 提交代码时, 注释该怎么写

    大致可以分为 6 种 : 添加 修改 修复 --> 修正 优化 --> 改进 ;

  2. tcp/ip (网络通讯协议)

    介绍 TCP: 传输控制协议, IP: 网际协议, TCP/IP: 供已连接互联网的计算机之间进行通信的通信协议 在tcp/ip内部 , 包含一系列处理数据通信的协议: tcp.udp.icmp.dh ...

  3. 用JavaScript判断一个对象是否数组?

    Q:如何判断一个对象是否为数组? A1:判断对象的constructor是否指向Array, 接着判断对应的特殊属性,如length,splice之类.这个很容易冒充. A2:使用instanceof ...

  4. ThreadLocalMap里Entry声明为WeakReference

    Java里,每个线程都有自己的ThreadLocalMap,里边存着自己私有的对象.Map的Entry里,key为ThreadLocal对象,value即为私有对象T.在spring MVC中,常用T ...

  5. Algorithm: dynamic programming

    1. Longest Increasing Subsequence (LIS) problem unsorted array, calculate out the maximum length of ...

  6. TensorFlow框架(6)之RNN循环神经网络详解

    1. RNN循环神经网络 1.1 结构 循环神经网络(recurrent neural network,RNN)源自于1982年由Saratha Sathasivam 提出的霍普菲尔德网络.RNN的主 ...

  7. 纯CSS3实现淡入淡出下拉菜单

    纯CSS3实现淡入淡出下拉菜单是一款比较简单清新的CSS3教程下拉菜单,这款下拉菜单是垂直方向的,点击主菜单项可以展开和折叠子菜单,在展开折叠的过程中伴随着淡入淡出的动画效果 源代码:http://w ...

  8. BZOJ 1724 [Usaco2006 Nov]Fence Repair 切割木板:贪心 优先队列【合并果子】

    题目链接:http://www.lydsy.com/JudgeOnline/problem.php?id=1724 题意: 你要将一块长木板切成n段,长度分别为a[i](长木板的长度 = ∑ a[i] ...

  9. YYYY-mm-dd HH:MM:SS 备忘录

    d 月中的某一天.一位数的日期没有前导零. dd 月中的某一天.一位数的日期有一个前导零. ddd 周中某天的缩写名称,在 AbbreviatedDayNames 中定义. dddd 周中某天的完整名 ...

  10. leetcode 102 Binary Tree Level Order Traversal(DFS||BFS)

    Given a binary tree, return the level order traversal of its nodes' values. (ie, from left to right, ...