zoukankan      html  css  js  c++  java
  • DomainObjectUtility

    using System;
    using System.Collections;
    using System.Collections.Generic;
    using System.Collections.Specialized;
    using System.Data;
    using System.Reflection;
    using System.Text;
    
    namespace LZHBaseFrame.Core.Domain
    {
    
        public class DomainObjectUtility
        {
            public static void CheckDomainObject(object domainObject, IDomainDataProvider domainObjectDataProvider)
            {
                if (!(domainObject is DomainObject))
                {
                    throw new Exception(string.Format("$Error_Should_Be_DomainObject[$DomainObject={0}]", domainObject));
                }
            }
            public static object CreateTypeInstance(Type type)
            {
                return type.Assembly.CreateInstance(type.FullName);
            }
            public static ArrayList GetMemberInfos(Type type)
            {
                ArrayList list1 = new ArrayList();
                MemberInfo[] infoArray1 = type.GetMembers();
                for (int num1 = 0; num1 < infoArray1.Length; num1++)
                {
                    MemberInfo info1 = infoArray1[num1];
    
                    if (((info1.MemberType == MemberTypes.Field) || (info1.MemberType == MemberTypes.Property)) && (info1.IsDefined(typeof(FieldMapAttribute), true) || info1.IsDefined(typeof(FieldMapAttribute), false)))
                    {
                        list1.Add(info1);
                    }
                }
                return list1;
            }
    
            public static ArrayList GetMemberInfos(object obj)
            {
                return DomainObjectUtility.GetMemberInfos(obj.GetType());
            }
    
            public static Hashtable GetKeyAttributeMemberInfos(object obj)
            {
                return DomainObjectUtility.GetKeyAttributeMemberInfos(DomainObjectUtility.GetTableMapAttribute(obj), DomainObjectUtility.GetMemberInfos(obj));
            }
    
            public static Hashtable GetKeyAttributeMemberInfos(Type type)
            {
                return DomainObjectUtility.GetKeyAttributeMemberInfos(DomainObjectUtility.GetTableMapAttribute(type), DomainObjectUtility.GetMemberInfos(type));
            }
    
            public static Hashtable GetKeyAttributeMemberInfos(TableMapAttribute tableMapAttribute, ArrayList memberInfos)
            {
                StringCollection keyFields = new StringCollection();
                keyFields.AddRange(tableMapAttribute.GetKeyFields());
                Hashtable hs = new Hashtable();
    
                foreach (MemberInfo info1 in memberInfos)
                {
                    FieldMapAttribute attribute = (FieldMapAttribute)System.Attribute.GetCustomAttribute(info1, typeof(FieldMapAttribute));
                    if (keyFields.IndexOf(attribute.FieldName) != -1)
                    {
                        hs.Add(attribute, info1);
                    }
                }
                return hs;
            }
    
            public static Hashtable GetNonKeyAttributeMemberInfos(object obj)
            {
                return DomainObjectUtility.GetNonKeyAttributeMemberInfos(DomainObjectUtility.GetTableMapAttribute(obj), DomainObjectUtility.GetMemberInfos(obj));
            }
    
            public static Hashtable GetNonKeyAttributeMemberInfos(Type type)
            {
                return DomainObjectUtility.GetNonKeyAttributeMemberInfos(DomainObjectUtility.GetTableMapAttribute(type), DomainObjectUtility.GetMemberInfos(type));
            }
    
            public static Hashtable GetNonKeyAttributeMemberInfos(TableMapAttribute tableMapAttribute, ArrayList memberInfos)
            {
                StringCollection keyFields = new StringCollection();
                keyFields.AddRange(tableMapAttribute.GetKeyFields());
                Hashtable hs = new Hashtable();
    
                foreach (MemberInfo info1 in memberInfos)
                {
                    FieldMapAttribute attribute = (FieldMapAttribute)System.Attribute.GetCustomAttribute(info1, typeof(FieldMapAttribute));
                    if (keyFields.IndexOf(attribute.FieldName) == -1)
                    {
                        hs.Add(attribute, info1);
                    }
                }
                return hs;
            }
    
            private static Hashtable hashtableAttributeMember = new Hashtable();
            public static Hashtable GetAttributeMemberInfos(object obj)
            {
                lock (hashtableAttributeMember)
                {
                    if (hashtableAttributeMember.ContainsKey(obj.GetType().FullName) == false)
                    {
                        hashtableAttributeMember.Add(obj.GetType().FullName, DomainObjectUtility.GetAttributeMemberInfos(DomainObjectUtility.GetMemberInfos(obj)));
                    }
                }
                return (Hashtable)hashtableAttributeMember[obj.GetType().FullName];
            }
    
            public static Hashtable GetAttributeMemberInfos(Type type)
            {
                lock (hashtableAttributeMember)
                {
                    if (hashtableAttributeMember.ContainsKey(type.FullName) == false)
                    {
                        hashtableAttributeMember.Add(type.FullName, DomainObjectUtility.GetAttributeMemberInfos(DomainObjectUtility.GetMemberInfos(type)));
                    }
                }
                return (Hashtable)hashtableAttributeMember[type.FullName];
            }
    
            private static Hashtable GetAttributeMemberInfos(ArrayList memberInfos)
            {
                Hashtable hs = new Hashtable();
    
                foreach (MemberInfo info1 in memberInfos)
                {
                    FieldMapAttribute attribute = (FieldMapAttribute)System.Attribute.GetCustomAttribute(info1, typeof(FieldMapAttribute));
                    try
                    {
                        hs.Add(attribute, info1);
                    }
                    catch (Exception)
                    {
    
                        throw new Exception("$Error_To_add_columns_is_repeat");
                    }
                    
                }
                return hs;
            }
    
            public static TableMapAttribute GetTableMapAttribute(Type type)
            {
                object attribute = System.Attribute.GetCustomAttribute(type, typeof(TableMapAttribute));
                return ((attribute != null) ? (TableMapAttribute)attribute : null);
            }
    
            public static TableMapAttribute GetTableMapAttribute(object obj)
            {
                return DomainObjectUtility.GetTableMapAttribute(obj.GetType());
            }
    
    
            public static DomainObject[] FillDomainObject(Type type, DataSet ds)
            {
                if (ds == null)
                {
                    return null;
                }
    
                if (ds.Tables[0].Rows.Count < 1)
                {
                    return null;
                }
    
                return DomainObjectUtility.FillDomainObject(type, ds.Tables[0]);
            }
    
            private static DomainObject[] FillDomainObject(Type type, DataTable table)
            {
                DomainObject[] domainObjects = new DomainObject[table.Rows.Count];
                int num1 = 0;
                foreach (DataRow dr in table.Rows)
                {
                    domainObjects[num1] = DomainObjectUtility.FillDomainObject(type.Assembly.CreateInstance(type.FullName), dr);
                    num1 = num1 + 1;
                }
    
                return domainObjects;
            }
    
            public static DomainObject FillDomainObject(object obj, DataRow dataRow)
            {
                Hashtable hs = DomainObjectUtility.GetAttributeMemberInfos(obj);
                Hashtable hsFields = GetFieldNameMapAttribute(obj.GetType().FullName, hs);
    
                foreach (DataColumn column in dataRow.Table.Columns)
                {
                    if (hsFields.Contains(column.ColumnName.ToUpper()))
                    {
                        DomainObjectUtility.SetValue(obj, (MemberInfo)hsFields[column.ColumnName.ToUpper()], dataRow[column.ColumnName]);
                    }
                }
    
                return (DomainObject)obj;
            }
            private static Hashtable hashtableFieldNameMap = new Hashtable();
            private static Hashtable GetFieldNameMapAttribute(string typeFullName, Hashtable hs)
            {
                lock (hashtableFieldNameMap)
                {
                    if (hashtableFieldNameMap.ContainsKey(typeFullName) == false)
                    {
                        Hashtable hsFields = new Hashtable(hs.Count);
                        foreach (FieldMapAttribute fa in hs.Keys)
                        {
                            hsFields.Add(fa.FieldName.ToUpper(), hs[fa]);
                        }
                        hashtableFieldNameMap.Add(typeFullName, hsFields);
                    }
                }
                return (Hashtable)hashtableFieldNameMap[typeFullName];
            }
    
            public static Hashtable GetFieldNameMemberInfoMap(Type type)
            {
                Hashtable returnValue = new Hashtable();
    
                foreach (MemberInfo info in type.GetMembers())
                {
                    FieldMapAttribute attribute = (FieldMapAttribute)System.Attribute.GetCustomAttribute(info, typeof(FieldMapAttribute));
    
                    if (attribute != null)
                    {
                        returnValue.Add(attribute.FieldName.Trim().ToLower(), info);
                    }
                }
    
                return returnValue;
            }
    
            public static object CSharpValue2DbValue(Type dataType, Type propertyType, object value)
            {
                if (propertyType == typeof(int))
                {
                    int num1 = Convert.ToInt32(value);
                    return num1;
                }
    
                if (propertyType == typeof(decimal))
                {
                    Decimal num1 = Convert.ToDecimal(value);
                    return num1;
                }
    
                if (propertyType == typeof(long))
                {
                    long num1 = (long)value;
                    return num1.ToString();
                }
    
                if (propertyType == typeof(string))
                {
                    if (value == null)
                    {
                        return "";
                    }
                    return value.ToString();
                }
    
                if (propertyType == typeof(bool))
                {
                    if (!((bool)value))
                    {
                        return "N";
                    }
                    return "Y";
                }
    
                if (propertyType == typeof(DateTime))
                {
                    DateTime time1 = (DateTime)value;
                    return time1.ToString("yyyy/MM/dd HH:mm:ss");
                }
    
                if (propertyType == typeof(byte[]))
                {
                    return value;
                }
    
                return value.ToString();
    
            }
    
            public static string XMLEncodeValue(Type propertyType, object value)
            {
                if (propertyType == typeof(int))
                {
                    int num1 = (int)value;
                    return num1.ToString();
                }
                if (propertyType == typeof(string))
                {
                    if (value == null)
                    {
                        return "";
                    }
                    return value.ToString();
                }
                if (propertyType == typeof(bool))
                {
                    if (!((bool)value))
                    {
                        return "N";
                    }
                    return "Y";
                }
    
                if (propertyType == typeof(DateTime))
                {
                    DateTime time1 = (DateTime)value;
                    return (time1.ToString("yyyy/MM/dd HH:mm:ss"));
                }
                return value.ToString();
            }
    
            public static object GetValue(object obj, MemberInfo mi, object[] index)
            {
                if (mi is FieldInfo)
                {
                    return ((FieldInfo)mi).GetValue(obj);
                }
                if (mi is PropertyInfo)
                {
                    return ((PropertyInfo)mi).GetValue(obj, index);
                }
    
                return null;
            }
    
            public static object GetValue(object domainObject, string propertyName, object[] index)
            {
                MemberInfo[] infos = domainObject.GetType().GetMember(propertyName);
    
                if (infos == null)
                {
                    throw new Exception("$Error_Property_Name_Not_Exist");
                    return null;
                }
    
                return GetValue(domainObject, infos[0], index);
            }
    
            public static void SetValue(object domainObject, string propertyName, object value)
            {
                ArrayList infos = DomainObjectUtility.GetMemberInfos(domainObject);
                MemberInfo info1 = null;
    
                foreach (MemberInfo info in infos)
                {
                    if (info.Name == propertyName)
                    {
                        info1 = info;
                        break;
                    }
                }
    
                if (info1 == null)
                {
                    throw new Exception("$Error_Property_Name_Not_Exist");
                }
    
                DomainObjectUtility.SetValue(domainObject, info1, value);
            }
    
            private static void SetValue(object domainObject, MemberInfo info, object value)
            {
                if (info == null)
                {
                    return;
                }
    
                FieldMapAttribute fa = (FieldMapAttribute)System.Attribute.GetCustomAttribute(info, typeof(FieldMapAttribute));
    
                if (fa == null)
                {
                    return;
                }
    
                Type type1 = (info is FieldInfo) ? ((FieldInfo)info).FieldType : ((PropertyInfo)info).PropertyType;
                if (fa.BlobType == BlobTypes.Binary)
                {
                    if (!((DomainObject)domainObject).IsBlobIgnored)
                    {
                        DomainObjectUtility.SetValue(domainObject, info, value, null);
                        return;
                    }
                }
    
                if (type1 == typeof(int))
                {
                    if (value is System.DBNull)
                    {
                        return;
                    }
                    else
                    {
                        DomainObjectUtility.SetValue(domainObject, info, System.Int32.Parse(value.ToString()), null);
                        return;
                    }
                }
    
                if (type1 == typeof(long))
                {
                    if (value is System.DBNull)
                    {
                        return;
                    }
    
                    DomainObjectUtility.SetValue(domainObject, info, System.Int64.Parse(value.ToString()), null);
                    return;
                }
    
                if (type1 == typeof(double))
                {
                    if (value is System.DBNull)
                    {
                        return;
                    }
    
                    DomainObjectUtility.SetValue(domainObject, info, System.Double.Parse(value.ToString()), null);
                    return;
                }
    
                if (type1 == typeof(float))
                {
                    if (value is System.DBNull)
                    {
                        return;
                    }
    
                    DomainObjectUtility.SetValue(domainObject, info, System.Single.Parse(value.ToString()), null);
                    return;
                }
    
                if (type1 == typeof(decimal))
                {
                    if (value is System.DBNull)
                    {
                        return;
                    }
    
                    //DomainObjectUtility.SetValue(domainObject, info, System.Decimal.Parse(DomainObjectUtility.GetValueString(value)), null);        
                    //说明: 以前的方法在高精度的double数据转换成decimal数据的时候,报参数类型不对的错误,原因是高精度的double的数据在ToString之后会编程科学记数法,因此decimal.parse的时候会出错
                    //解决方法: 私有方法专门对
                    DomainObjectUtility.SetValue(domainObject, info, DomainObjectUtility.Getdecimal(value), null);
                    return;
                }
    
                if (type1 == typeof(bool))
                {
                    DomainObjectUtility.SetValue(domainObject, info, value.ToString() == "Y", null);
                    return;
                }
                if (type1 == typeof(string))
                {
                    DomainObjectUtility.SetValue(domainObject, info, value.ToString(), null);
                    return;
                }
    
                if (type1 == typeof(DateTime))
                {
                    DateTime result;
                    DateTime.TryParse(value.ToString(), out result);
                    DomainObjectUtility.SetValue(domainObject, info, result, null);
    
                    return;
                }
    
                if (type1.IsEnum)
                {
                    DomainObjectUtility.SetValue(domainObject, info, Enum.Parse(type1, value.ToString()), null);
                    return;
                }
    
                DomainObjectUtility.SetValue(domainObject, info, value, null);
            }
    
            private static decimal Getdecimal(object obj)
            {
                string returnStr = obj.ToString();
                if (obj.GetType() == typeof(double))
                {
                    return (decimal)Math.Round((double)obj, 8);
                }
    
                return decimal.Parse(returnStr);
            }
    
            public static void SetValue(object obj, MemberInfo mi, object value, object[] index)
            {
                if (mi is FieldInfo)
                {
                    if (value is System.DBNull)
                    {
                        ((FieldInfo)mi).SetValue(obj, null);
                    }
                    else
                    {
    
                        ((FieldInfo)mi).SetValue(obj, value);
                    }
                }
                else if (mi is PropertyInfo)
                {
                    if (value is System.DBNull)
                    {
                        ((PropertyInfo)mi).SetValue(obj, null, index);
                    }
                    else
                    {
                        ((PropertyInfo)mi).SetValue(obj, value, index);
                    }
                }
            }
    
            /// <summary>
            /// 获得DomainObject中定义了FieldMapAttribute的属性名或字段名
            /// </summary>
            /// <param name="type">DomainObject的类型</param>
            /// <returns></returns>
            public static ArrayList GetDomainObjectScheme(Type type)
            {
                ArrayList array = DomainObjectUtility.GetMemberInfos(type);
                ArrayList scheme = new ArrayList(array.Count);
    
                foreach (MemberInfo info in array)
                {
                    scheme.Add(info.Name);
                }
    
                return scheme;
            }
    
            /// <summary>
            /// 获得DomainObject中定义了FieldMapAttribute,且为主键的属性名或字段名
            /// </summary>
            /// <param name="type">DomainObject的类型</param>
            /// <returns></returns>
            public static string[] GetDomainObjectKeyScheme(Type type)
            {
                Hashtable ht = DomainObjectUtility.GetKeyAttributeMemberInfos(type);
                ArrayList scheme = new ArrayList(ht.Count);
    
                foreach (MemberInfo info in ht.Values)
                {
                    scheme.Add(info.Name);
                }
    
                return (string[])scheme.ToArray(typeof(string));
            }
    
            /// <summary>
            ///  获得DomainObject中定义了FieldMapAttribute的属性名或字段名的值
            /// </summary>
            /// <param name="obj">DomainObject</param>
            /// <returns></returns>
            public static ArrayList GetDomainObjectValues(DomainObject obj)
            {
                ArrayList array = DomainObjectUtility.GetMemberInfos(obj);
                ArrayList values = new ArrayList(array.Count);
    
                foreach (MemberInfo info in array)
                {
                    values.Add(DomainObjectUtility.GetValue(obj, info, null));
                }
    
                return values;
            }
    
            /// <summary>
            ///  获得DomainObject中定义了FieldMapAttribute,且为主键的属性名或字段名的值
            /// </summary>
            /// <param name="obj">DomainObject</param>
            /// <returns></returns>
            public static object[] GetDomainObjectKeyValues(DomainObject obj)
            {
                Hashtable ht = DomainObjectUtility.GetKeyAttributeMemberInfos(obj);
                ArrayList values = new ArrayList(ht.Count);
    
                foreach (MemberInfo info in ht.Values)
                {
                    values.Add(DomainObjectUtility.GetValue(obj, info, null));
                }
    
                return (object[])values.ToArray(typeof(object));
            }
    
            /// <summary>
            /// 获得DomainObject对应的所有数据库字段名
            /// </summary>
            /// <param name="type">DomainObject的类型</param>
            /// <returns></returns>
            public static ArrayList GetDomainObjectFieldsName(Type type)
            {
                Hashtable hs = DomainObjectUtility.GetAttributeMemberInfos(type);
                ArrayList array = new ArrayList(hs.Count);
    
                foreach (FieldMapAttribute attr in hs.Keys)
                {
                    array.Add(attr.FieldName);
                }
    
                return array;
            }
    
            /// <summary>
            /// 获得DomainObject对应的所有数据库字段名,用','拼成的字符串
            /// </summary>
            /// <param name="type">DomainObject的类型</param>
            /// <returns></returns>
            public static string GetDomainObjectFieldsString(Type type)
            {
                return String.Join(", ", (string[])DomainObjectUtility.GetDomainObjectFieldsName(type).ToArray(typeof(string)));
            }
    
            /// <summary>
            /// 获得DomainObject对应的 数据库表名.字段名,用','拼成的字符串
            /// </summary>
            /// <param name="type">DomainObject的类型</param>
            /// <returns></returns>
            public static string GetDomainObjectFieldsStringWithTableName(Type type)
            {
                string tableName = DomainObjectUtility.GetTableMapAttribute(type).TableName;
                string[] fieldNames = (string[])DomainObjectUtility.GetDomainObjectFieldsName(type).ToArray(typeof(string));
    
                for (int i = 0; i < fieldNames.Length; i++)
                {
                    fieldNames[i] = string.Format("{0}.{1}", tableName, fieldNames[i]);
                }
    
                return String.Join(", ", fieldNames);
            }
    
            /// <summary>
            /// 将src中各属性的值复制到des中
            /// </summary>
            /// <param name="src"></param>
            /// <param name="des"></param>
            public static void MembersClone(DomainObject src, DomainObject des)
            {
                foreach (MemberInfo info in DomainObjectUtility.GetMemberInfos(src))
                {
                    DomainObjectUtility.SetValue(des, info.Name, DomainObjectUtility.GetValue(src, info, null));
                }
            }
    
            /// <summary>
            /// 根据对象的字段名取出数据库中的字段名
            /// </summary>
            /// <param name="type">domain对象</param>
            /// <param name="attributeName">domain对象的字段名</param>
            /// <returns>数据库中的字段名</returns>
            public static string GetFieldName(Type type, string attributeName)
            {
                System.Reflection.MemberInfo[] mems = type.GetMembers();
                foreach (System.Reflection.MemberInfo mem in mems)
                {
                    if (mem.Name == attributeName)
                    {
                        object[] objs = mem.GetCustomAttributes(typeof(LZHBaseFrame.Core.Domain.FieldMapAttribute), true);
                        if (objs != null && objs.Length > 0)
                        {
                            LZHBaseFrame.Core.Domain.FieldMapAttribute fieldMap = objs[0] as LZHBaseFrame.Core.Domain.FieldMapAttribute;
                            if (fieldMap != null)
                            {
                                return fieldMap.FieldName;
                            }
                        }
                    }
                }
                return null;
            }
    
            public static string GetPropertyNameByFieldName(Type domainObjectType, string fieldName)
            {
                string returnValue = string.Empty;
    
                if (fieldName.IndexOf(".") >= 0)
                {
                    fieldName = fieldName.Substring(fieldName.IndexOf(".") + 1);
                }
    
                if (fieldName.Trim().Length > 0)
                {
                    Hashtable fieldNameMemberInfoMap = GetFieldNameMemberInfoMap(domainObjectType);
                    MemberInfo info = (MemberInfo)fieldNameMemberInfoMap[fieldName.Trim().ToLower()];
    
                    if (info != null)
                    {
                        returnValue = info.Name;
                    }
                }
    
                return returnValue;
            }
        }
    }
  • 相关阅读:
    【数据库领域】mysql中in与or对比
    数据库优化
    数据库-索引
    数据库-事务
    数据库-视图
    数据库设计
    数据库编程提高
    数据库高级操作
    数据库基本操作
    with-上下文管理器
  • 原文地址:https://www.cnblogs.com/Jeely/p/11350745.html
Copyright © 2011-2022 走看看