C#利用反射实现实体类ListT索引器
生活随笔
收集整理的這篇文章主要介紹了
C#利用反射实现实体类ListT索引器
小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.
相關(guān)背景:
? ? ? ? ? 在項(xiàng)目開(kāi)發(fā)中,我們經(jīng)常會(huì)自定義一些實(shí)體類(lèi),在某些需要?jiǎng)討B(tài)賦值的功能中,我們無(wú)法知道到下一個(gè)需要賦值的字段名稱(chēng)是什么,只知道會(huì)從其他返回需要賦值的字段名稱(chēng)和值,這時(shí)候就需要實(shí)現(xiàn)索引器了,就像C# Datatable中的行索引器一樣,可以根據(jù)字段名稱(chēng)實(shí)現(xiàn)查找和賦值,如下所示:
DataTable dt = new DataTable(); dt.Columns.Add("UserName", typeof(string)); DataRow dr = dt.NewRow(); dr["UserName"] = “張三”;//索引器 dt.Rows.add(dr);實(shí)體類(lèi)的索引器的代碼如下圖所示:
public abstract class EntityBase{/// <summary>/// 索引器,可以用字符串訪問(wèn)變量屬性/// </summary>/// <param name="_propertyName">屬性名稱(chēng)</param>/// <returns>屬性值,如果傳入的屬性名稱(chēng)不存在,返回null</returns>public object this[string _propertyName]{get{var pi = this.GetType().GetProperties(BindingFlags.Instance|BindingFlags.Public|BindingFlags.DeclaredOnly).FirstOrDefault(p => p.Name.Equals(_propertyName));//從所有獲取的屬性值中找到傳入的屬性值if (null != pi && null != pi.GetMethod){return pi.GetValue(this);}else{return null;}}set{var pi = this.GetType().GetProperties().FirstOrDefault(p => p.Name.Equals(_propertyName));if (null != pi && null != pi.SetMethod){if (pi.PropertyType.Equals(value.GetType())){pi.SetValue(this, value);}else{pi.SetValue(this, Convert.ChangeType(value, pi.PropertyType));}}}}}EntityBase為抽象類(lèi),無(wú)法實(shí)例化,只要實(shí)體類(lèi)繼承EntityBase,便可獲得索引器功能,如下圖所示:
public class TabUser:EntityBase {public string UserName { get; set; }public string UserPwd { get; set; }public long UserID { get; set; } }TabUser User = UserLists.FirstOrDefault(); string pwd = User["UserPwd"].ToString();//實(shí)體類(lèi)索引器?
總結(jié)
以上是生活随笔為你收集整理的C#利用反射实现实体类ListT索引器的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: java.lang.ClassNotFo
- 下一篇: c# char unsigned_dll