转自:http://blog.csdn.net/lanx_fly/article/details/53914338

背景简介

以前看过一些代码,是简单的读取SqlReader然后赋值给Model,我不是不赞同这种做法,只是看到大篇幅的赋值操作真的有点浪费时间和精力,尤其是一些老项目居多。我看到的还好,多的也就60多个字段且不用其他ORM,如果涉及到变更的话,那么对维护人员来说可能不仅仅是眼力活甚至还是....体力活。另外就是表格的操作,因为鄙人之前也是写过类似的项目,列名对应着Model属性名,一个不差,隐隐觉得它们之间应该联系起来,所以想能不能尽可能简化它的操作?可能是自己做得项目太少,只能想到反射这种方法,但是反射的性能大家也都了解,大量的反射赋值耗时可以慢到你眨几下眼睛,但这对程序来说我觉得是一场灾难。因此结合反射发出的方法写了这个库,如果能给大家在项目上带来一些便利我也就知足了。

案例1:

  1. public class Student : INMSReflector {
  2. public string Name;
  3. public string Description { get; set; }
  4. public static string StaticField;
  5. public static string StaticProperty { get; set; }
  6. }

引用步骤:

  1. Step1 : 引用类库.
  2. Step2 : using NMSReflector.
  3. Step3 : 将你的类实现INMSReflector接口;(当然了,如果你嫌麻烦,可以改一下源码,在ModelOperator.cs中).
  4. Step4 : 用Create方法创建缓存. (会扫描搜索入口程序集的所有类)

由于类库中对object类型做了扩展,因此对象实例可以调用扩展方法。

1、EmitSet(string propertyName,object value)  为对象的字段或属性赋值

2、EmitGet(string propertyName) 获取对象某字段或者属性值

用法:

  1. ModelOperator.Create();
  2. Student t = new Student();
  3. //普通字段
  4. t.Name = "小明";
  5. t.EmitSet("Name", "小明胸前的红领巾更加鲜艳了!");
  6. Console.WriteLine(t.Name);
  7. Console.WriteLine(t.EmitGet("Name"));
  8. //普通属性
  9. t.EmitSet("Description", "他爱着小刚");
  10. Console.WriteLine(t.Description);
  11. Console.WriteLine(t.EmitGet("Description"));
  12. //静态字段
  13. t.EmitSet("StaticFiled", "是他挨着小刚");
  14. Console.WriteLine(Student.StaticField);
  15. Console.WriteLine(t.EmitGet("StaticField"));
  16. //静态属性
  17. t.EmitSet("StaticProperty", "刚才打错了");
  18. Console.WriteLine(Student.StaticProperty);
  19. Console.WriteLine(t.EmitGet("StaticProperty"));

结果:

案例2:

支持Column标签
  1. public class Student : INMSReflector
  2. {
  3. public string Name;
  4. [Column("Note")]
  5. public string Description { get; set; }
  6. public static string StaticField;
  7. public static string StaticProperty { get; set; }
  8. }

注意:

  1. 这里的标签是来自于System.ComponentModel.DataAnnotations.Schema;
  2. 所以需要using System.ComponentModel.DataAnnotations.Schema;

用法:

无论传标签设置的名字还是属性名,都可以赋值或者获取值。
  1. ModelOperator.Create();
  2. Student t = new Student();
  3. t.EmitSet("Note", "设置标签");
  4. Console.WriteLine(t.Description);
  5. Console.WriteLine(t.EmitGet("Note"));

结果:

其他:

ModelOperator类提供了更多的操作函数。
  1. 与object的扩展方法有所不同,第一个参数需要把实例传进去
  2. //获取实例t的某字段和属性的值
  3. object Get<T>(T t, string propertyName)
  4. //设置实例t的某字段和属性的值
  5. void Set<T>(T t, string propertyName, object value)
  6. //获取类型T的某字段和属性的类型
  7. Type GetType<T>(string propertyName)
  8. //获取类型T的设置方法缓存
  9. Dictionary<string, Action<object, object>> GetSetCache<T>()
  10. //获取类型T的获取方法缓存
  11. Dictionary<string, Func<object, object>> GetGetCache<T>()
  12. //获取类型T的属性字段类型缓存
  13. Dictionary<string, Type> GetTypeCache<T>()
  14. //获取类型T的标签与属性字段缓存
  15. Dictionary<string, string> GetMapCache<T>()

性能测试:

一个简易的反射类库NMSReflector的更多相关文章

  1. [后端人员耍前端系列]AngularJs篇:使用AngularJs打造一个简易权限系统

    一.引言 上一篇博文已经向大家介绍了AngularJS核心的一些知识点,在这篇博文将介绍如何把AngularJs应用到实际项目中.本篇博文将使用AngularJS来打造一个简易的权限管理系统.下面不多 ...

  2. AngularJs打造一个简易权限系统

    AngularJs打造一个简易权限系统 一.引言 上一篇博文已经向大家介绍了AngularJS核心的一些知识点,在这篇博文将介绍如何把AngularJs应用到实际项目中.本篇博文将使用AngularJ ...

  3. Angularjs,WebAPI 搭建一个简易权限管理系统

    Angularjs,WebAPI 搭建一个简易权限管理系统 Angularjs名词与概念(一)   1. 目录 前言 Angularjs名词与概念 权限系统原型 权限系统业务 数据库设计和实现 Web ...

  4. day-1 用python编写一个简易的FTP服务器

    从某宝上购买了一份<Python神经网络深度学习>课程,按照视频教程,用python语言,写了一个简易的FTP服务端和客户端程序,以前也用C++写过聊天程序,编程思路差不多,但是pytho ...

  5. RPC框架原理简述:从实现一个简易RPCFramework说起(转)

    摘要: 本文阐述了RPC框架与远程调用的产生背景,介绍了RPC的基本概念和使用背景,之后手动实现了简易的RPC框架并佐以实例进行演示,以便让各位看官对RPC有一个感性.清晰和完整的认识,最后讨论了RP ...

  6. 手动实现一个简易版SpringMvc

    版权声明:本篇博客大部分代码引用于公众号:java团长,我只是在作者基础上稍微修改一些内容,内容仅供学习与参考 前言:目前mvc框架经过大浪淘沙,由最初的struts1到struts2,到目前的主流框 ...

  7. javascript基础修炼(12)——手把手教你造一个简易的require.js

    目录 一. 概述 二. require.js 2.1 基本用法 2.2 细说API设计 三. 造轮子 3.1 模块加载执行的步骤 3.2 代码框架 3.3 关键函数的代码实现 示例代码托管在我的代码仓 ...

  8. 从零开始实现一个简易的Java MVC框架(三)--实现IOC

    Spring中的IOC IoC全称是Inversion of Control,就是控制反转,他其实不是spring独有的特性或者说也不是java的特性,他是一种设计思想.而DI(Dependency ...

  9. 造轮子:实现一个简易的 Spring IoC 容器

    作者:DeppWang.原文地址 我通过实现一个简易的 Spring IoC 容器,算是入门了 Spring 框架.本文是对实现过程的一个总结提炼,需要配合源码阅读,源码地址. 结合本文和源码,你应该 ...

随机推荐

  1. 使用Xmanager远程连接CentOS6.4图形界面详解(图文)

    1.首先安装与下载图形界面GNOMEyum groupinstall "Desktop"yum groupinstall "X Window System"yu ...

  2. Java Swing 第03记 布局管理器

    几种Swing常用的布局管理器 BorderLaout 它将容器分为5个部分,即东.南.西.北.中,每一个区域可以容纳一个组件,使用的时候也是通过BorderLayout中5个方位常量来确定组件所在的 ...

  3. GnuRadio Hacking①:使用GnuRadio+SDR破解固定码无线遥控

    0×01 信号捕获 在这篇文章中,我们将使用GnuRadio+SDR硬件对某品牌型号的无线跳蛋进行无线重放攻击的演示. 市面上常见的无线遥控工作的频段,通常工作在315Mhz.433Mhz,也有少数的 ...

  4. NOIP 考前 高斯消元练习

    POJ 1830 列出n个方程右边为最后的情况 每一行代表第几个灯的情况,每一行代表是否按第几个按钮写出方程即可. #include <cstdio> #include <cstri ...

  5. How can i use iptables save on centos 7?

    I installed CentOS 7 with minimal configuration (os + dev tools). I am trying to open 80 port for ht ...

  6. Lua查找表元素过程(元表、__index方法是如何工作的)

    近日开始研究Lua,在元表的使用上照猫画虎地搞了两下,实现了“面向对象”,但究其本质却略有不解,后咨询牛哥得解,特此记录. Lua的表本质其实是个类似HashMap的东西,其元素是很多的Key-Val ...

  7. CPU指令集

    cpu作为一台电脑中的核心,它的作用是无法替代的.而cpu本身只是在块硅晶片上所集成的超大规模的集成电路,集成的晶体管数量可达到上亿个,是由非常先进复杂的制造工艺制造出来的,拥有相当高的科技含量. C ...

  8. 第三个Sprint冲刺第八天

    讨论地点:宿舍 讨论成员:邵家文.李新.朱浩龙.陈俊金 讨论问题:做最后的工作

  9. vs2005连接sqlserver2008数据库遇到的问题

    vs2005连接sqlserver2008时总是弹出“此服务器不支持,必须安装microsoft sql server 2005 bate 2 或更高版本.”如下图所示: 解决方法: 1.先安装vs2 ...

  10. PowerDesigner生成Oracle数据库时,表名会带引号问题

    使用PowerDesigner生成数据库建表SQL脚本时,尤其是Oracle数据库时,表名一般会带引号.其实加引号是PL/SQL的规范,数据库会严格按照""中的名称建表,如果没有& ...