簡(jiǎn)易的反射類庫(kù)NMSReflector該怎么理解

簡(jiǎn)易的反射類庫(kù)NMSReflector該怎么理解,針對(duì)這個(gè)問題,這篇文章詳細(xì)介紹了相對(duì)應(yīng)的分析和解答,希望可以幫助更多想解決這個(gè)問題的小伙伴找到更簡(jiǎn)單易行的方法。

我們提供的服務(wù)有:成都網(wǎng)站制作、成都網(wǎng)站設(shè)計(jì)、微信公眾號(hào)開發(fā)、網(wǎng)站優(yōu)化、網(wǎng)站認(rèn)證、瀘溪ssl等。為1000+企事業(yè)單位解決了網(wǎng)站和推廣的問題。提供周到的售前咨詢和貼心的售后服務(wù),是有科學(xué)管理、有技術(shù)的瀘溪網(wǎng)站制作公司

背景簡(jiǎn)介

         以前看過一些代碼,是簡(jiǎn)單的讀取SqlReader然后賦值給Model,我不是不贊同這種做法,只是看到大篇幅的賦值操作真的有點(diǎn)浪費(fèi)時(shí)間和精力,尤其是一些老項(xiàng)目居多。我看到的還好,多的也就60多個(gè)字段且不用其他ORM,如果涉及到變更的話,那么對(duì)維護(hù)人員來說可能不僅僅是眼力活甚至還是....體力活。另外就是表格的操作,因?yàn)楸扇酥耙彩菍戇^類似的項(xiàng)目,列名對(duì)應(yīng)著Model屬性名,一個(gè)不差,隱隱覺得它們之間應(yīng)該聯(lián)系起來,所以想能不能盡可能簡(jiǎn)化它的操作?可能是自己做得項(xiàng)目太少,只能想到反射這種方法,但是反射的性能大家也都了解,大量的反射賦值耗時(shí)可以慢到你眨幾下眼睛,但這對(duì)程序來說我覺得是一場(chǎng)災(zāi)難。因此結(jié)合反射發(fā)出的方法寫了這個(gè)庫(kù),如果能給大家在項(xiàng)目上帶來一些便利我也就知足了。

案例1:

public class Student : INMSReflector { 

public string Name;

public string Description { get; set; }        

public static string StaticField; 

public static string StaticProperty { get; set; }    

}

引用步驟:

  1. Step1 : 引用類庫(kù).   

  2. Step2 : using NMSReflector.  

  3. Step3 : 將你的類實(shí)現(xiàn)INMSReflector接口;(當(dāng)然了,如果你嫌麻煩,可以改一下源碼,在ModelOperator.cs中).  

  4. Step4 : 用Create方法創(chuàng)建緩存. (會(huì)掃描搜索入口程序集的所有類)  

由于類庫(kù)中對(duì)object類型做了擴(kuò)展,因此對(duì)象實(shí)例可以調(diào)用擴(kuò)展方法。

1、EmitSet(string propertyName,object value)  為對(duì)象的字段或?qū)傩再x值

2、EmitGet(string propertyName) 獲取對(duì)象某字段或者屬性值 

用法:

ModelOperator.Create();   

Student t = new Student();   

//普通字段   

t.Name = "小明";   

t.EmitSet("Name", "小明胸前的紅領(lǐng)巾更加鮮艷了!");   

Console.WriteLine(t.Name);   

Console.WriteLine(t.EmitGet("Name"));   

//普通屬性   

t.EmitSet("Description", "他愛著小剛");   

Console.WriteLine(t.Description);   

Console.WriteLine(t.EmitGet("Description"));   

//靜態(tài)字段   

t.EmitSet("StaticFiled", "是他挨著小剛");   

Console.WriteLine(Student.StaticField);   

Console.WriteLine(t.EmitGet("StaticField"));   

//靜態(tài)屬性   

t.EmitSet("StaticProperty", "剛才打錯(cuò)了");   

Console.WriteLine(Student.StaticProperty);   

Console.WriteLine(t.EmitGet("StaticProperty"));  

ModelOperator.Create();   
Student t = new Student();   
//普通字段   
t.Name = "小明";   
t.EmitSet("Name", "小明胸前的紅領(lǐng)巾更加鮮艷了!");   
Console.WriteLine(t.Name);   
Console.WriteLine(t.EmitGet("Name"));   
//普通屬性   
t.EmitSet("Description", "他愛著小剛");   
Console.WriteLine(t.Description);   
Console.WriteLine(t.EmitGet("Description"));   
//靜態(tài)字段   
t.EmitSet("StaticFiled", "是他挨著小剛");   
Console.WriteLine(Student.StaticField);   
Console.WriteLine(t.EmitGet("StaticField"));   
//靜態(tài)屬性   
t.EmitSet("StaticProperty", "剛才打錯(cuò)了");   
Console.WriteLine(Student.StaticProperty);   
Console.WriteLine(t.EmitGet("StaticProperty"));

結(jié)果:

簡(jiǎn)易的反射類庫(kù)NMSReflector該怎么理解

案例2:

支持Column標(biāo)簽

public class Student : INMSReflector 

public string Name; 

[Column("Note")] 

public string Description { get; set; } 

public static string StaticField; 

public static string StaticProperty { get; set; } 

}

public class Student : INMSReflector 

{ 

	public string Name; 

	[Column("Note")] 

	public string Description { get; set; } 

	public static string StaticField; 

	public static string StaticProperty { get; set; } 

}

注意:

這里的標(biāo)簽是來自于System.ComponentModel.DataAnnotations.Schema; 

所以需要using System.ComponentModel.DataAnnotations.Schema;

用法:

無論傳標(biāo)簽設(shè)置的名字還是屬性名,都可以賦值或者獲取值。

ModelOperator.Create(); 

Student t = new Student(); 

t.EmitSet("Note", "設(shè)置標(biāo)簽"); 

Console.WriteLine(t.Description);

Console.WriteLine(t.EmitGet("Note"));

其他:

ModelOperator類提供了更多的操作函數(shù)。

與object的擴(kuò)展方法有所不同,第一個(gè)參數(shù)需要把實(shí)例傳進(jìn)去

//獲取實(shí)例t的某字段和屬性的值

object Get<T>(T t, string propertyName)

//設(shè)置實(shí)例t的某字段和屬性的值

void Set<T>(T t, string propertyName, object value)

//獲取類型T的某字段和屬性的類型

Type GetType<T>(string propertyName)

//獲取類型T的設(shè)置方法緩存

Dictionary<string, Action<object, object>> GetSetCache<T>()

//獲取類型T的獲取方法緩存

Dictionary<string, Func<object, object>> GetGetCache<T>()

//獲取類型T的屬性字段類型緩存

Dictionary<string, Type> GetTypeCache<T>()

//獲取類型T的標(biāo)簽與屬性字段緩存

Dictionary<string, string> GetMapCache<T>()

性能測(cè)試:

簡(jiǎn)易的反射類庫(kù)NMSReflector該怎么理解

關(guān)于簡(jiǎn)易的反射類庫(kù)NMSReflector該怎么理解問題的解答就分享到這里了,希望以上內(nèi)容可以對(duì)大家有一定的幫助,如果你還有很多疑惑沒有解開,可以關(guān)注創(chuàng)新互聯(lián)行業(yè)資訊頻道了解更多相關(guān)知識(shí)。

本文名稱:簡(jiǎn)易的反射類庫(kù)NMSReflector該怎么理解
轉(zhuǎn)載來于:http://muchs.cn/article20/gppoco.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供用戶體驗(yàn)、小程序開發(fā)靜態(tài)網(wǎng)站、手機(jī)網(wǎng)站建設(shè)、商城網(wǎng)站、網(wǎng)站內(nèi)鏈

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如需處理請(qǐng)聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來源: 創(chuàng)新互聯(lián)

成都網(wǎng)站建設(shè)