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 = ; 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) != -)
{
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) == -)
{
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[].Rows.Count < )
{
return null;
} return DomainObjectUtility.FillDomainObject(type, ds.Tables[]);
} private static DomainObject[] FillDomainObject(Type type, DataTable table)
{
DomainObject[] domainObjects = new DomainObject[table.Rows.Count];
int num1 = ;
foreach (DataRow dr in table.Rows)
{
domainObjects[num1] = DomainObjectUtility.FillDomainObject(type.Assembly.CreateInstance(type.FullName), dr);
num1 = num1 + ;
} 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[], 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, );
} 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 = ; 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 > )
{
LZHBaseFrame.Core.Domain.FieldMapAttribute fieldMap = objs[] 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(".") >= )
{
fieldName = fieldName.Substring(fieldName.IndexOf(".") + );
} if (fieldName.Trim().Length > )
{
Hashtable fieldNameMemberInfoMap = GetFieldNameMemberInfoMap(domainObjectType);
MemberInfo info = (MemberInfo)fieldNameMemberInfoMap[fieldName.Trim().ToLower()]; if (info != null)
{
returnValue = info.Name;
}
} return returnValue;
}
}
}
DomainObjectUtility的更多相关文章
随机推荐
- 解决ubuntu下eth0不显示
今天电脑重启之后,用ifconfig查看网络地址,就发现eth0神奇的消失了,顿时感觉吓尿了. 按照网上看到的资料,发现输入ifconfig -a 发现可以显示eth0,但是当输入ifconfig就没 ...
- 浏览器调起摄像头(jquery+layui)
/* 实例化camvas配置参数 config = { video:{width:Number(scale*4),height:Number(scale*3)},//视频比例4:3 canvasId: ...
- 重温spark基本原理
(一)spark特点: 1.高效,采用内存存储中间计算结果,并通过并行计算DAG图的优化,减少了不同任务之间的依赖,降低了延迟等待时间. 2.易用,采用函数式编程风格,提供了超过80种不同的Trans ...
- [Codeforces 364D]Ghd(随机算法+gcd)
[Codeforces 364D]Ghd(随机算法) 题面 给出n个正整数,在其中选出n/2(向上取整)个数,要求这些数的最大公约数最大,求最大公约数的最大值 分析 每个数被选到的概率\(\geq \ ...
- Codeforces - 1191F - Tokitsukaze and Strange Rectangle - 组合数学 - 扫描线
https://codeforces.com/contest/1191/problem/F 看了一下题解的思路,感觉除了最后一段以外没什么启发. 首先离散化x加快速度,免得搞多一个log.其实y不需要 ...
- 图例演示在Linux上快速安装软RAID的详细步骤
物理环境:虚拟机centos6.4 配置:8G内存.2*2核cpu.3块虚拟硬盘(sda,sdb,sdc,sdb和sdc是完全一样的) 在实际生产环境中,系统硬盘与数据库和应用是分开的, ...
- Redis设计与实现 -- 动态字符串对象(SDS)
1. 动态字符串( simple dynamic string, SDS) 在 Redis 中,当需要可以被重复修改的字符串时,会使用 SDS 类型 ,而不是 C 语言中默认的 C 字符串类型 .举个 ...
- JS 函数 学习笔记
函数是一段可以反复调用的代码块.函数还能接受输入的参数,不同的参数会返回不同的值 声明函数的 5 种方式 具名函数 (function 命令) function f(x, y){ return x + ...
- [转载]Linux上使用ssl进行端口转发
原文地址:Linux上使用ssl进行端口转发 作者:呼延十 背景介绍 作为一个后端程序员,经常要和别人联调接口,每当这时,总是被公司的各种,dev,qa,pre,prod环境搞得头疼,,,我真的只是想 ...
- 369-双路千兆网络PCIe收发卡
双路千兆网络PCIe收发卡 一.产品概述 PCIe网络收发卡要求能支持千兆光口,千兆电口:半高板卡.板卡插于服务器,室温工作. 支持2路千兆光口,千兆电口. FPGA选用型号 XC7A50T-1FGG ...