zoukankan      html  css  js  c++  java
  • ConvertHelper 通用类

    public class ConvertHelper<T> where T : new()
        {
            private static Dictionary<Type, List<IPropertyConvertInfo>> ConvertInfo = new Dictionary<Type, List<IPropertyConvertInfo>>();
    
            public static ObservableCollection<T> ConvertToList(DataTable dt)
            {
                List<IPropertyConvertInfo> convertInfo = ConvertInfo.ContainsKey(typeof(T)) ? ConvertInfo[typeof(T)] : ParseConvertInfo(typeof(T));
                convertInfo = convertInfo.Where(v => dt.Columns.Contains(v.ColumnName)).ToList();
                return new ObservableCollection<T>(dt.Rows.Cast<DataRow>().Select(v => ConvertRowToModel(convertInfo, v)));
            }
    
            #region ==== Private Mothods ====
    
            private static List<IPropertyConvertInfo> ParseConvertInfo(Type modelType)
            {
                var properties = modelType.GetProperties().Where(v => v.IsDefined(typeof(ColumnNameAttribute), true))
                    .Select(v => CreatePropertyConvertInfo(v)).ToList();
                ConvertInfo[modelType] = properties;
                return properties;
            }
    
            private static IPropertyConvertInfo CreatePropertyConvertInfo(PropertyInfo property)
            {
                IPropertyConvertInfo info = Activator.CreateInstance(typeof(PropertyConvertInfo<>).MakeGenericType(property.PropertyType)) as IPropertyConvertInfo;
                info.ColumnName = ((ColumnNameAttribute)property.GetCustomAttributes(typeof(ColumnNameAttribute), true)[0]).ColumnName;
                info.Property = property;
                return info;
            }
    
            private static T ConvertRowToModel(List<IPropertyConvertInfo> convertInfo, DataRow dataRow)
            {
                T model = new T();
                convertInfo.ForEach(v => v.DoFetchData(model, dataRow));
                return model;
            }
    
            #endregion ==== Private Mothods ====
        }
    
        internal interface IPropertyConvertInfo
        {
            PropertyInfo Property { get; set; }
            string ColumnName { get; set; }
            void DoFetchData(object model, DataRow row);
        }
        internal class PropertyConvertInfo<TProperty> : IPropertyConvertInfo
        {
            public PropertyInfo Property { get; set; }
            public string ColumnName { get; set; }
    
            public void DoFetchData(object model, DataRow row)
            {
                if (!(row[ColumnName] is DBNull))
                {
                    if (row[ColumnName].GetType().ToString() == "System.Decimal")
                    {
                        object value = Convert.ToDouble(row[ColumnName]);
                        Property.SetValue(model, value, null);
                    }
                    else if (row[ColumnName].GetType().ToString() =="System.SByte")
                    {
                        object value = Convert.ToBoolean(row[ColumnName]);
                        Property.SetValue(model, value, null);
                    }
                    else
                    {
                        Property.SetValue(model, row.Field<TProperty>(ColumnName), null);
                    }
                }
            }
        }
  • 相关阅读:
    Python下用Tkinter进行GUI编程
    6月3日——回首一个半月
    Consistent Hashing算法
    学生终究要面对社会
    MySQL的锁(1)
    Memcached笔记之分布式算法(idv2.com)
    4月21日总结
    2012.3.29小结
    C#调用c++创建的dll
    以post方式发送文档到端口
  • 原文地址:https://www.cnblogs.com/xh831213/p/5085074.html
Copyright © 2011-2022 走看看