• 一个简易的反射类库NMSReflector


     

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

    背景简介

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

    案例1:

    [csharp] view plain copy
     
     print?在CODE上查看代码片派生到我的代码片
    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. }  

    引用步骤:

    [html] view plain copy
     
     print?在CODE上查看代码片派生到我的代码片
    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) 获取对象某字段或者属性值 

    用法:

    [csharp] view plain copy
     
     print?在CODE上查看代码片派生到我的代码片
    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标签
    [csharp] view plain copy
     
     print?在CODE上查看代码片派生到我的代码片
    1. public class Student : INMSReflector   
    2.   
    3. {   
    4.   
    5.     public string Name;   
    6.   
    7.     [Column("Note")]   
    8.   
    9.     public string Description { get; set; }   
    10.   
    11.     public static string StaticField;   
    12.   
    13.     public static string StaticProperty { get; set; }   
    14.   
    15. }  

    注意:

    [html] view plain copy
     
     print?在CODE上查看代码片派生到我的代码片
    1. 这里的标签是来自于System.ComponentModel.DataAnnotations.Schema;   
    2. 所以需要using System.ComponentModel.DataAnnotations.Schema;  

    用法:

    无论传标签设置的名字还是属性名,都可以赋值或者获取值。
    [csharp] view plain copy
     
     print?在CODE上查看代码片派生到我的代码片
    1. ModelOperator.Create();   
    2. Student t = new Student();   
    3. t.EmitSet("Note", "设置标签");   
    4. Console.WriteLine(t.Description);  
    5. Console.WriteLine(t.EmitGet("Note"));  

    结果:

    其他:

    ModelOperator类提供了更多的操作函数。
    [csharp] view plain copy
     
     print?在CODE上查看代码片派生到我的代码片
    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>()  

    性能测试:

  • 相关阅读:
    FND_CONCURRENT.SET_COMPLETION_STATUS(服务器端函数)
    Oracle 11i与12R在功能上有什么区别
    查看oracle数据库最近执行了哪些sql语句
    How to Change the First Accounting Open Period
    AR Adjustment
    Oracle 临时表
    (转)不用安装oracle客户端,PL/SQL也能远程访问数据库
    ERP 是否支持同个账户,同一时间,只能有一个连接?
    多组织访问控制(MOAC)
    【精华ASP代码收集】
  • 原文地址:https://www.cnblogs.com/sunjie9606/p/6235560.html
Copyright © 2020-2023  润新知