zoukankan      html  css  js  c++  java
  • Net特性与反射 DEMO

    对于特性与反射的一些基本知识可以参考MSDN:http://msdn.microsoft.com/zh-cn/library/vstudio/ms173183.aspx

    下面利用反射与特性做了一个关于实现DataTable与实体之间的相互转化的Demo.

    实体类 Author:

     public partial class Author
        {
            public Author()
            { }
            #region Model
            private int _id;
            private string _title;
            private string _content;
            private string _email;
            private string _sex;
            /// <summary>
            /// 
            /// </summary>
            [DataFiled("Id", SqlDbType.Int)]
            public int Id
            {
                set { _id = value; }
                get { return _id; }
            }
            /// <summary>
            /// 
            /// </summary>
            [DataFiled("Title", SqlDbType.VarChar)]
            public string Title
            {
                set { _title = value; }
                get { return _title; }
            }
            /// <summary>
            /// 
            /// </summary>
            [DataFiled("Content", SqlDbType.VarChar)]
            public string Content
            {
                set { _content = value; }
                get { return _content; }
            }
            /// <summary>
            /// 
            /// </summary>
            [DataFiled("Email", SqlDbType.VarChar)]
            public string Email
            {
                set { _email = value; }
                get { return _email; }
            }
            /// <summary>
            /// 
            /// </summary>
            [DataFiled("Sex", SqlDbType.VarChar)]
            public string Sex
            {
                set { _sex = value; }
                get { return _sex; }
            }
            #endregion Model
     
        }

    自定义特性类DataFiledAttribute和NoDataFiledAttribute类:

     [AttributeUsage(AttributeTargets.All, AllowMultiple = true)]
        public class DataFiledAttribute : Attribute
        {
            private string name;
            private SqlDbType paramType;
            private int size;
            /// <summary>
            /// 
            /// </summary>
            public string FieldName
            {
                get { return this.name == null ? string.Empty : this.name; }
                set { this.name = value; }
            }
     
            public SqlDbType SqlDbType
            {
                get { return this.paramType; }
                set { this.paramType = value; }
            }
     
            public int Size
            {
                get { return this.size; }
                set { this.size = value; }
            }
     
            public bool IsSizeDefined
            {
                get { return size != 0; }
            }
     
            public DataFiledAttribute(string strFieldName, SqlDbType sdtSqlDbType, int iSize)
            {
                this.name = strFieldName;
                this.paramType = sdtSqlDbType;
                this.size = iSize;
            }
     
            public DataFiledAttribute(string strFieldName, SqlDbType sdtSqlDbType)
                : this(strFieldName, sdtSqlDbType, 0)
            {
               
            }
     
        }
        [AttributeUsage(AttributeTargets.All, AllowMultiple = true)]
        public class NoDataFiledAttribute : Attribute { }

    下面的是实现转化的类了微笑

    public class ModelHandler<T>
        {
            /// <summary>
            /// 实体列表转为DataTable 注意:使用本方法,须要实体中的每个属性必须添加DataFieldAttribute特性
            /// </summary>
            /// <param name="objlist">实体列表</param>
            /// <returns>返回DataTable</returns>
            public static System.Data.DataTable Model2DataTable(List<T> objlist)
            {
                if (objlist.Count == 0) return null;
                DataTable dt = GeneratorDataTable(typeof(T));
                foreach (T obj in objlist)
                {
                    Type modelType = obj.GetType();
                    PropertyInfo[] properties = modelType.GetProperties();
                    DataRow dr = dt.NewRow();
                    for (int i = 0; i < properties.Length; i++)
                    {
                        dr[i] = properties[i].GetGetMethod().Invoke(obj, null);
                    }
                    dt.Rows.Add(dr);
                }
                return dt;
            }
            private static DataTable GeneratorDataTable(Type modelType)
            {
                //Type modelType = obj.GetType();
                PropertyInfo[] properties = modelType.GetProperties();
                DataFiledAttribute d = null;
                DataTable dt = new DataTable();
                for (int i = 0; i < properties.Length; i++)
                {
                    DataColumn dc = new DataColumn();
                    d = Attribute.GetCustomAttribute(properties[i], typeof(DataFiledAttribute)) as DataFiledAttribute;
                    dc.ColumnName = d.FieldName;
                    dc.DataType = typeof(string);
                    dt.Columns.Add(dc);
    
                }
                return dt;
            }
            /// <summary>
            /// DataTable转为实体列表
            /// </summary>
            /// <param name="dt"></param>
            /// <returns></returns>
            public static List<T> DataTable2Model(DataTable dt)
            {
                if (dt.Rows.Count == 0)
                {
                    return null;
                }
                List<T> list = new List<T>();
    
                foreach (DataRow dr in dt.Rows)
                {
                    T obj = Activator.CreateInstance<T>();
                    foreach (DataColumn dc in dt.Columns)
                    {
                        PropertyInfo info = obj.GetType().GetProperty(dc.ColumnName);
                        Type t = info.PropertyType;
                        info.SetValue(obj, Convert.ChangeType(dr[dc], t), null);
                    }
                    list.Add(obj);
                }
                return list;
    
            }
        }

    具体实现如下:

    Author model = new Author();
                model.Id = 1;
                model.Title = "test";
                model.Content = null;
                List<Author> list = new List<Author>();
                list.Add(model);
                DataTable dt = ModelHandler<Author>.Model2DataTable(list);
                List<Author> list1 = new List<Author>();
                list1 = ModelHandler<Author>.DataTable2Model(dt);

    查看一下结果:

       DataTable:2013-01-17_100234

      list<model>:2013-01-17_100400

  • 相关阅读:
    centos7的变化(转)
    配置邮件报警功能(脚本方式)
    临时和永久关闭Selinux
    centos7.2安装apache比较简单,直接上代码
    zabbix--------配置邮件报警功能---服务器上配置---------
    初来驾到学java修饰符的使用
    面向对象小小理解
    出来驾到学java3
    出来驾到学java2
    初来驾到学JAVA
  • 原文地址:https://www.cnblogs.com/guolihao/p/2863954.html
Copyright © 2011-2022 走看看