一个简易的反射类库NMSReflector

背景简介


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


案例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:


支持Column标签
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"));


结果:



其他:

ModelOperator类提供了更多的操作函数。
与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>()



性能测试:



  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值