为了解决从数据库读取的表字段和自己建的viewModel字段名称不相符的问题
本人小白,初次将特性及反射应用到实例,写的不好的地方还请大家多多包涵
新建一个控制台应用程序命名为ReflectAndAttribute
自定义一个特性MTestyAttribute
namespace ReflectAndAttribute { [AttributeUsage(AttributeTargets.Property)] public class MTestyAttribute:Attribute { public MTestyAttribute(string fieldName) { this.FiledName = fieldName; } public string FiledName { get; set; } } }
定义个类StudentEntity模拟接收实体
public class StudentEntity
{
[MTesty("Name1")]
public string Name { get; set; }
public string Sex { get; set; }
}
定义一个泛型方法DtToModelList
public static List<T> GetModelList<T>(DataTable dt) where T : class, new() { // 定义集合 List<T> ts = new List<T>(); //定义一个临时变量 string tempName = string.Empty; //遍历DataTable中所有的数据行 foreach (DataRow dr in dt.Rows) { T t = new T(); // 获得此模型的公共属性 PropertyInfo[] propertys = t.GetType().GetProperties(); foreach (PropertyInfo pi in propertys) { MTestyAttribute attr = (MTestyAttribute)Attribute.GetCustomAttribute(pi, typeof(MTestyAttribute)); //将属性名称赋值给临时变量 tempName = pi.Name; //特性不为null修改 tempName if (attr != null) { tempName = attr.FiledName; } if (dt.Columns.Contains(tempName)) { //取值 object value = dr[tempName]; //如果非空,则赋给对象的属性 if (value != DBNull.Value) { pi.SetValue(t, value.ToString(), null); } } } ts.Add(t); } return ts; }
控制台代码
using System; using System.Data; namespace ReflectAndAttribute { class Program { static void Main(string[] args) { //模拟数据表 DataTable dt = new DataTable("Table_Student"); dt.Columns.Add("Name1", System.Type.GetType("System.String")); dt.Columns.Add("Sex", System.Type.GetType("System.String")); DataRow dr = dt.NewRow(); dr["Name1"] = "AX"; dr["Sex"] = "M"; var dr1 = dt.NewRow(); dr1["Name1"] = "BX"; dr1["Sex"] = "F"; var dr2 = dt.NewRow(); dr2["Name1"] = "CX"; dr2["Sex"] = "F"; dt.Rows.Add(dr); dt.Rows.Add(dr1); dt.Rows.Add(dr2); //接收实体 var studentList = DtToModelList.GetModelList<StudentEntity>(dt); //输出结果 foreach(var student in studentList) { Console.WriteLine(string.Format("学生名字为:{0}", student.Name)); Console.WriteLine(string.Format("学生性别为:{0}", student.Sex)); } Console.ReadKey(); } } }