一个简易的反射类库NMSReflector
转自:http://blog.csdn.net/lanx_fly/article/details/53914338
背景简介
以前看过一些代码,是简单的读取SqlReader然后赋值给Model,我不是不赞同这种做法,只是看到大篇幅的赋值操作真的有点浪费时间和精力,尤其是一些老项目居多。我看到的还好,多的也就60多个字段且不用其他ORM,如果涉及到变更的话,那么对维护人员来说可能不仅仅是眼力活甚至还是....体力活。另外就是表格的操作,因为鄙人之前也是写过类似的项目,列名对应着Model属性名,一个不差,隐隐觉得它们之间应该联系起来,所以想能不能尽可能简化它的操作?可能是自己做得项目太少,只能想到反射这种方法,但是反射的性能大家也都了解,大量的反射赋值耗时可以慢到你眨几下眼睛,但这对程序来说我觉得是一场灾难。因此结合反射发出的方法写了这个库,如果能给大家在项目上带来一些便利我也就知足了。
案例1:
- public class Student : INMSReflector {
- public string Name;
- public string Description { get; set; }
- public static string StaticField;
- public static string StaticProperty { get; set; }
- }
引用步骤:
- Step1 : 引用类库.
- Step2 : using NMSReflector.
- Step3 : 将你的类实现INMSReflector接口;(当然了,如果你嫌麻烦,可以改一下源码,在ModelOperator.cs中).
- Step4 : 用Create方法创建缓存. (会扫描搜索入口程序集的所有类)
由于类库中对object类型做了扩展,因此对象实例可以调用扩展方法。
1、EmitSet(string propertyName,object value) 为对象的字段或属性赋值
2、EmitGet(string propertyName) 获取对象某字段或者属性值
用法:
- ModelOperator.Create();
- Student t = new Student();
- //普通字段
- t.Name = "小明";
- t.EmitSet("Name", "小明胸前的红领巾更加鲜艳了!");
- Console.WriteLine(t.Name);
- Console.WriteLine(t.EmitGet("Name"));
- //普通属性
- t.EmitSet("Description", "他爱着小刚");
- Console.WriteLine(t.Description);
- Console.WriteLine(t.EmitGet("Description"));
- //静态字段
- t.EmitSet("StaticFiled", "是他挨着小刚");
- Console.WriteLine(Student.StaticField);
- Console.WriteLine(t.EmitGet("StaticField"));
- //静态属性
- t.EmitSet("StaticProperty", "刚才打错了");
- Console.WriteLine(Student.StaticProperty);
- Console.WriteLine(t.EmitGet("StaticProperty"));
结果:
案例2:
- public class Student : INMSReflector
- {
- public string Name;
- [Column("Note")]
- public string Description { get; set; }
- public static string StaticField;
- public static string StaticProperty { get; set; }
- }
注意:
- 这里的标签是来自于System.ComponentModel.DataAnnotations.Schema;
- 所以需要using System.ComponentModel.DataAnnotations.Schema;
用法:
- ModelOperator.Create();
- Student t = new Student();
- t.EmitSet("Note", "设置标签");
- Console.WriteLine(t.Description);
- Console.WriteLine(t.EmitGet("Note"));
结果:
其他:
- 与object的扩展方法有所不同,第一个参数需要把实例传进去
- //获取实例t的某字段和属性的值
- object Get<T>(T t, string propertyName)
- //设置实例t的某字段和属性的值
- void Set<T>(T t, string propertyName, object value)
- //获取类型T的某字段和属性的类型
- Type GetType<T>(string propertyName)
- //获取类型T的设置方法缓存
- Dictionary<string, Action<object, object>> GetSetCache<T>()
- //获取类型T的获取方法缓存
- Dictionary<string, Func<object, object>> GetGetCache<T>()
- //获取类型T的属性字段类型缓存
- Dictionary<string, Type> GetTypeCache<T>()
- //获取类型T的标签与属性字段缓存
- Dictionary<string, string> GetMapCache<T>()
性能测试:
一个简易的反射类库NMSReflector的更多相关文章
- [后端人员耍前端系列]AngularJs篇:使用AngularJs打造一个简易权限系统
一.引言 上一篇博文已经向大家介绍了AngularJS核心的一些知识点,在这篇博文将介绍如何把AngularJs应用到实际项目中.本篇博文将使用AngularJS来打造一个简易的权限管理系统.下面不多 ...
- AngularJs打造一个简易权限系统
AngularJs打造一个简易权限系统 一.引言 上一篇博文已经向大家介绍了AngularJS核心的一些知识点,在这篇博文将介绍如何把AngularJs应用到实际项目中.本篇博文将使用AngularJ ...
- Angularjs,WebAPI 搭建一个简易权限管理系统
Angularjs,WebAPI 搭建一个简易权限管理系统 Angularjs名词与概念(一) 1. 目录 前言 Angularjs名词与概念 权限系统原型 权限系统业务 数据库设计和实现 Web ...
- day-1 用python编写一个简易的FTP服务器
从某宝上购买了一份<Python神经网络深度学习>课程,按照视频教程,用python语言,写了一个简易的FTP服务端和客户端程序,以前也用C++写过聊天程序,编程思路差不多,但是pytho ...
- RPC框架原理简述:从实现一个简易RPCFramework说起(转)
摘要: 本文阐述了RPC框架与远程调用的产生背景,介绍了RPC的基本概念和使用背景,之后手动实现了简易的RPC框架并佐以实例进行演示,以便让各位看官对RPC有一个感性.清晰和完整的认识,最后讨论了RP ...
- 手动实现一个简易版SpringMvc
版权声明:本篇博客大部分代码引用于公众号:java团长,我只是在作者基础上稍微修改一些内容,内容仅供学习与参考 前言:目前mvc框架经过大浪淘沙,由最初的struts1到struts2,到目前的主流框 ...
- javascript基础修炼(12)——手把手教你造一个简易的require.js
目录 一. 概述 二. require.js 2.1 基本用法 2.2 细说API设计 三. 造轮子 3.1 模块加载执行的步骤 3.2 代码框架 3.3 关键函数的代码实现 示例代码托管在我的代码仓 ...
- 从零开始实现一个简易的Java MVC框架(三)--实现IOC
Spring中的IOC IoC全称是Inversion of Control,就是控制反转,他其实不是spring独有的特性或者说也不是java的特性,他是一种设计思想.而DI(Dependency ...
- 造轮子:实现一个简易的 Spring IoC 容器
作者:DeppWang.原文地址 我通过实现一个简易的 Spring IoC 容器,算是入门了 Spring 框架.本文是对实现过程的一个总结提炼,需要配合源码阅读,源码地址. 结合本文和源码,你应该 ...
随机推荐
- JS总结 运算符 条件语句
算术运算符+-*/ 与数学计算一致,配合()号进行各种计算 另外,+号还可以达到连接的作用.例如: var a = 15; alert("a的值等于"+a); 前后增减量运算符: ...
- Github上有趣的资料 | JS
留着,以后用得着,原文地址:http://www.jianshu.com/p/7c9aa9508641 collection AlloyImage 基于HTML5的专业级图像处理开源引擎.An ima ...
- IntelliJ IDEA注册码
1.打开IJ,help选项下的register 2. 选择Activation code 将注册码粘到内容框里,点击ok即可 43B4A73YYJ-eyJsaWNlbnNlSWQiOiI0M0I0QT ...
- Oracle 导入导出--and一些知识,备忘
这两天在做迁移Ora数据库,有一个圆友帮忙,哈哈,两个臭皮匠顶半个诸葛亮. 本来以为很简单的就imp和exp就欧了,结果各种状况百出,百度了老多,学到好多东西. 你的导出:exp yc/yc@orcl ...
- 听课程C# Intermediate: Classes, Interfaces and OOP的笔记,持续修改更新ing
在第二章第7节中,我尝试并给我的Vistal Studio 2015加装了Resharper,感觉非常好用,现在就分享下我的一点心得. 首先为了防止Resharper的快捷键失灵,可以先重置所有的 V ...
- android view :事件
在view绘制完成后,要想在和view交互一定就要使用事件了,这些事件包括触屏,按键,以及轨迹球,说起轨迹球,在黑莓的手机上常见,现在触屏出来之后基本上就没有这个东西了.这些事件从屏幕上产生出来,会进 ...
- Xcode6 storyboard new push segue 后的视图控制器没有navigation item bug.
手动切一下 老的push,再切回来,就会出有了,我想是一个bug. Xcode 6 Segue with UINavigationItem up vote0down votefavorite I' ...
- 让LinqToSQL使用Web.Config中的链接字符串(修改Settings.Designer.cs)
[global::System.Configuration.ApplicationScopedSettingAttribute()] [global::System.Diagnostics.Debug ...
- C语言读取PE文件信息(一)
接下来的内容来源于对该博客文章http://www.pediy.com/kssd/pediy06/pediy7006.htm的解析. 一.打印Sections信息.下面的程序打印出Windows_Gr ...
- ubuntu安装rpm包
ubuntu下的rpm包的安装方法 一般是不能够直接安装的,我们需要一个工具叫alien,先install它吧.然后按照下面择所需. 1.直接安装: alien -i -c filename.rpm ...