簡易的反射類庫NMSReflector該怎么理解,針對這個問題,這篇文章詳細介紹了相對應的分析和解答,希望可以幫助更多想解決這個問題的小伙伴找到更簡單易行的方法。
我們提供的服務有:成都網(wǎng)站制作、成都網(wǎng)站設計、微信公眾號開發(fā)、網(wǎng)站優(yōu)化、網(wǎng)站認證、瀘溪ssl等。為1000+企事業(yè)單位解決了網(wǎng)站和推廣的問題。提供周到的售前咨詢和貼心的售后服務,是有科學管理、有技術(shù)的瀘溪網(wǎng)站制作公司
以前看過一些代碼,是簡單的讀取SqlReader然后賦值給Model,我不是不贊同這種做法,只是看到大篇幅的賦值操作真的有點浪費時間和精力,尤其是一些老項目居多。我看到的還好,多的也就60多個字段且不用其他ORM,如果涉及到變更的話,那么對維護人員來說可能不僅僅是眼力活甚至還是....體力活。另外就是表格的操作,因為鄙人之前也是寫過類似的項目,列名對應著Model屬性名,一個不差,隱隱覺得它們之間應該聯(lián)系起來,所以想能不能盡可能簡化它的操作?可能是自己做得項目太少,只能想到反射這種方法,但是反射的性能大家也都了解,大量的反射賦值耗時可以慢到你眨幾下眼睛,但這對程序來說我覺得是一場災難。因此結(jié)合反射發(fā)出的方法寫了這個庫,如果能給大家在項目上帶來一些便利我也就知足了。
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 : 將你的類實現(xiàn)INMSReflector接口;(當然了,如果你嫌麻煩,可以改一下源碼,在ModelOperator.cs中).
Step4 : 用Create方法創(chuàng)建緩存. (會掃描搜索入口程序集的所有類)
由于類庫中對object類型做了擴展,因此對象實例可以調(diào)用擴展方法。
1、EmitSet(string propertyName,object value) 為對象的字段或?qū)傩再x值
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à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", "小明胸前的紅領巾更加鮮艷了!"); 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"));
支持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; }
}
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類提供了更多的操作函數(shù)。
與object的擴展方法有所不同,第一個參數(shù)需要把實例傳進去
//獲取實例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>()
關(guān)于簡易的反射類庫NMSReflector該怎么理解問題的解答就分享到這里了,希望以上內(nèi)容可以對大家有一定的幫助,如果你還有很多疑惑沒有解開,可以關(guān)注創(chuàng)新互聯(lián)行業(yè)資訊頻道了解更多相關(guān)知識。
本文名稱:簡易的反射類庫NMSReflector該怎么理解
轉(zhuǎn)載來于:http://aaarwkj.com/article20/gppoco.html
成都網(wǎng)站建設公司_創(chuàng)新互聯(lián),為您提供用戶體驗、小程序開發(fā)、靜態(tài)網(wǎng)站、手機網(wǎng)站建設、商城網(wǎng)站、網(wǎng)站內(nèi)鏈
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時需注明來源: 創(chuàng)新互聯(lián)