利用特性和反射给泛型Model赋值

为了解决从数据库读取的表字段和自己建的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();
        }
    }
}
原文地址:https://www.cnblogs.com/Mindy-hym/p/6640061.html