相关背景:
在项目开发中,我们经常会自定义一些实体类,在某些需要动态赋值的功能中,我们无法知道到下一个需要赋值的字段名称是什么,只知道会从其他返回需要赋值的字段名称和值,这时候就需要实现索引器了,就像C# Datatable中的行索引器一样,可以根据字段名称实现查找和赋值,如下所示:
DataTable dt = new DataTable();
dt.Columns.Add("UserName", typeof(string));
DataRow dr = dt.NewRow();
dr["UserName"] = “张三”;//索引器
dt.Rows.add(dr);
实体类的索引器的代码如下图所示:
public abstract class EntityBase{/// <summary>/// 索引器,可以用字符串访问变量属性/// </summary>/// <param name="_propertyName">属性名称</param>/// <returns>属性值,如果传入的属性名称不存在,返回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为抽象类,无法实例化,只要实体类继承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();//实体类索引器