• 利用特性和反射给泛型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();
            }
        }
    }
  • 相关阅读:
    阿里数据中台
    智慧公安及移动执法平台(中云微迅)
    平安智慧城市的智慧政务
    数据分析师干货-业务逻辑篇
    数据分析师常用商业模型(一)
    智慧政务大数据云平台解决方案
    说几个flink好做spark却不好做的场景
    spark比flink好用的点
    干货好文!自底向上——知识图谱构建技术初探
    用户分析模型
  • 原文地址:https://www.cnblogs.com/Mindy-hym/p/6640061.html
Copyright © 2020-2023  润新知