反射是动态获取程序集的元数据的一种技术,这句话是做.NET程序员面试题目的一个的答案,你可选择记住它,就好比高中生物学里面讲到的细胞的结构的课程时,细胞由细胞膜,细胞质和细胞核组成。根据做程序的经验,Never ask why不是好习惯,即使是微软的API,有时候违反了调用约定,也会很抓狂。

请看下面这一段代码 
Assembly assembly = Assembly.GetExecutingAssembly();

object entryForm = Activator.CreateInstance(formBaseType) as Form;

entryForm .MdiParent = this; 
entryForm .Show(); 
entryForm .Activate(); 
代码的含义比较简单,从当前程序集中创建formBaseType类型,并调用它的方法。从方法名上来看,大概可以看出,这是一段MDI创建child子窗体,并显示子窗体的代码。 
这段小代码,也是插件式框架的基本思路,请参考《Management Console 工具管理类软件通用开发框架(开放源码)》中的例子来体会它的用处。 
在ERP/MIS系统中,应用反射的例子,实在是太多了。数据访问接口InventoryMovementDAL,借助于反射,来查找并调用它的实现类; 窗体也它的子窗体借助于反射来获取属性,传递值;ERP系统的整个框架,也是借助于反射搭建起来.

看下面的图,ERP的三个模块Paradox.ERP.SystemAdministration, Paradox.ERP.Engineering,Paradox.ERP.Inventory被Paradox.Framework.Kernal反射调用,如果再写一个Paradox.ERP.Sales的销售模块,几乎不需要改动,就可以让它被框架调用。

动态编译的例子,是应用到一个工资系统中. 请看图 

对于如何解析工资的formular公式,有若干种办法,这里使有的是动态编译的方法。把每一个工资项看成是一个类型class的属性,Formular的内容则放到一个方法中去,当成表达式计算求职,最后应用反射,返回各属性的值即可。 
public class FormularCalculation 
    { 
        public static object Build(string[] items, string formular) 
        { 
            string nameSpace = "A"; 
            string className = "FormularCalculation"; 
            string methodName = "Run"; 
            CSharpCodeProvider compiler = new CSharpCodeProvider(); 
            CompilerParameters paras = new CompilerParameters(); 
            paras.GenerateExecutable = false; 
            paras.GenerateInMemory = true; 
            
           StringBuilder classSrc = new StringBuilder(); 
            classSrc.Append(" using  System;"+Environment.NewLine); 
            classSrc.Append(" namespace "+nameSpace+" { " + Environment.NewLine); 
            classSrc.Append("public  class  " + className + "{ " + Environment.NewLine); 
            foreach (string item in items) 
            { 
                classSrc.Append("public decimal " + item + ";" + Environment.NewLine); 
            } 
            classSrc.Append("public  void Run() { 基本工资=5000; " + Environment.NewLine); 
             string [] format= Regex.Split(formular,Environment.NewLine); 
             foreach (string prop in format) 
             { 
                 classSrc.Append(prop +" ;"+ Environment.NewLine); 
             } 
            classSrc.Append("}"+Environment.NewLine); 
            classSrc.Append("}" + Environment.NewLine); 
            classSrc.Append("}" + Environment.NewLine); 
            string source = classSrc.ToString();

CompilerResults result = compiler.CompileAssemblyFromSource(paras, source); 
            CompilerErrorCollection error= result.Errors; 
            Assembly assembly = result.CompiledAssembly; 
            object eval = assembly.CreateInstance(nameSpace+"."+className); 
            MethodInfo method = eval.GetType().GetMethod(methodName); 
            object reobj = method.Invoke(eval, null); 
            return eval; 
        } 
    } 
调用方法如下 
string[] items = { "应发合计","基本工资","奖金","福利费", "扣款合计","社保","税","实发合计","应税所得额"}; 
string formular=@ ”    应发合计=基本工资+ 奖金 + 福利费 - 扣款合计; 
扣款合计=社保 + 税+ 应税所得额; 
实发合计=应发合计-  扣款合计; "; 
object obj = FormularCalculation.Build(items, formular); 
            Type type = obj.GetType(); 
            foreach (PropertyInfo fi in type.GetProperties(BindingFlags.NonPublic | BindingFlags.Public 
                                               | BindingFlags.Instance | BindingFlags.DeclaredOnly)) 
            { 
                string value = fi.Name;  //取到计算后的各个属性的值 
            } 
动态编译还应用于软件的加密,在内存中产生加密程序的源代码,动态编译并运行,检测是否符合license授权。

C# 反射,动态编译的更多相关文章

  1. Java学习:注解,反射,动态编译

    狂神声明 : 文章均为自己的学习笔记 , 转载一定注明出处 ; 编辑不易 , 防君子不防小人~共勉 ! Java学习:注解,反射,动态编译 Annotation 注解  什么是注解 ? Annotat ...

  2. 反射已经"Out",动态编译才能"Hold"住

    Net支持反射功能以后,确实使我们Net程序眼前一亮啊,真是太神奇了,只需要传入字符串就可以完成功能.可以说,反射功能的引入,使我们在处理某些问题上更加得心应手. 传统的Db管理软件中,数据库字段的频 ...

  3. (转载)JAVA动态编译--字节代码的操纵

    在一般的Java应用开发过程中,开发人员使用Java的方式比较简单.打开惯用的IDE,编写Java源代码,再利用IDE提供的功能直接运行Java 程序就可以了.这种开发模式背后的过程是:开发人员编写的 ...

  4. java动态编译笔记

    1 前言 Java的动态编译知识,真真在实际开发中并不是经常遇到.但是学习java动态编译有助于我们从更深一层次去了解java.对掌握jdk的动态代理模式,这样我们在学习其他一些开源框架的时候就能够知 ...

  5. 重写代码生成器支持模板(多层架构,MVC),多语言c#,java;支持mysql和sqlserver,动态编译

    多年前用过李天平前辈的,自己改过,后来李老师做动软了,不给源码,修改不是很方便.加上我目前需要转java方向,于是决定自己搞.到目前为止花了整整一个星期了,看看目前的成果. 最后是代码工程文件,用c# ...

  6. 浅谈VB.Net 程序的编译和动态编译

    ---恢复内容开始--- 一般,我们都是通过Visual Studio(下面简称vs)来编写和编译vb.net应用程序的,但是,不少的人并不知道vs是通过何种方式编译程序的.今天,我们就来探讨一下编译 ...

  7. .NET中的动态编译

    代码的动态编译并执行是一个.NET平台提供给我们的很强大的工具用以灵活扩展(当然是面对内部开发人员)复杂而无法估算的逻辑,并通过一些额外的代码来扩展我们已有 的应用程序.这在很大程度上给我们提供了另外 ...

  8. Java_Java SE6调用动态编译

    转自:http://www.cnblogs.com/flyoung2008/archive/2011/11/14/2249017.html 一.使用JavaCompiler接口编译java源程序 我们 ...

  9. .net 动态编译解决考勤计算问题

    由于公司实施SAP HR项目,但是SAP HR对考勤功能真的太弱化了,直接从考勤机上读取的原始打卡记录不能直接传输到HR系统里面,因为SAP HR不能识别那些多余的打卡记录,而且必须把打卡记录进行成组 ...

随机推荐

  1. 怎么在一台电脑上安装win7与centos7双系统

    对于用习惯windows系统的小伙伴们来说,好像Linux系统的命令操作感觉会比较神秘,进而有部分小伙伴就想说也学一学LInux操作系统.但是苦于资源的问题--就一台计算机,一块硬盘,担心说如果安装了 ...

  2. C++_构造函数与析构函数

    构造函数与析构函数 OOP第二课 1 构造函数 1.1 构造函数具有一些特殊的性质 1.2 定义构造函数的一般形式 1.3 利用构造函数创建对象 2 成员初始化表 3 缺省参数的构造函数 4 重载构造 ...

  3. 在linux系统中用docker搭建ss

    首先呢,你的先有一台自己的服务器把,这个就不多赘述了,我自己买了一台国外的VPS. 一.docker的安装 首先我们来看下服务器的版本信息: cat /etc/redhat-release //Cen ...

  4. C++ —— 类中static和const关键字声明变量的初始化方式总结

    在类中声明变量/常量时,经常会用到static.const关键字.对于该变/常量的初始化问题,网上有许多相关文章,但是大多不够完善,或者存在错误.经过实际验证,总结如下: (注明:测试编译平台为VS2 ...

  5. C#基础 const和readonly关键字

    静态常量 所谓静态常量就是在编译期间会对变量进行解析,再将常量的值替换成初始化的值.动态常量 所谓动态常量就是编译期间会将变量标记只读常量,而不用常量的值代替,这样在声明时可以不初始化,可以延迟到构造 ...

  6. Linux入门进阶第五天——用户管理(帐号管理 )下

    一.身份切换 为了避免 rm -rf /* 的悲剧发生,平时使用时,尽量使用一般帐号!需要环境设置等必要时才使用root 1.su命令 一般地,推荐使用su - / su - username的形式来 ...

  7. 20155204 2016-2017-2 《Java程序设计》第10周学习总结

    20155204 2016-2017-2 <Java程序设计>第10周学习总结 教材学习内容总结 1.计算机网络概述 路由器和交换机组成了核心的计算机网络,计算机只是这个网络上的节点以及控 ...

  8. 20155211 2016-2017-2 《Java程序设计》第一周学习总结

    20155211 2006-2007-2 <Java程序设计>第1周学习总结 教材学习内容总结 首先根据博客上的指导安装了jdk,并且首次尝试了设置环境变量path和classpath. ...

  9. 20155231 2016-2017-2 《Java程序设计》第2周学习总结

    20155231 2016-2017-2 <Java程序设计>第2周学习总结 教材学习内容总结 学习目标: 了解java编程风格 认识java的类型与变量 掌握java流程控制 第三章基础 ...

  10. # 2016-2017-2 20155319 《Java程序设计》实验四Android程序开发实验报告

    2016-2017-2 20155319 <Java程序设计>实验四Android程序开发实验报告 实验一 实验内容 Android Stuidio的安装测试: 参考<Java和An ...