溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務(wù)條款》

簡易的反射類庫NMSReflector該怎么理解

發(fā)布時間:2022-01-05 17:10:15 來源:億速云 閱讀:111 作者:柒染 欄目:大數(shù)據(jù)

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

背景簡介

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

案例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 : 引用類庫.   

  2. Step2 : using NMSReflector.  

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

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

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

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

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

用法:

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", "剛才打錯了");   

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", "剛才打錯了");   
Console.WriteLine(Student.StaticProperty);   
Console.WriteLine(t.EmitGet("StaticProperty"));

結(jié)果:

簡易的反射類庫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ò)展方法有所不同,第一個參數(shù)需要把實例傳進(jìn)去

//獲取實例t的某字段和屬性的值

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

//設(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>()

性能測試:

簡易的反射類庫NMSReflector該怎么理解

關(guān)于簡易的反射類庫NMSReflector該怎么理解問題的解答就分享到這里了,希望以上內(nèi)容可以對大家有一定的幫助,如果你還有很多疑惑沒有解開,可以關(guān)注億速云行業(yè)資訊頻道了解更多相關(guān)知識。

向AI問一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進(jìn)行舉報,并提供相關(guān)證據(jù),一經(jīng)查實,將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI