using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Reflection;
using System.Collections;
using System.Collections.Specialized;
using System.Data;
using System.Xml;
namespace CMS_PF.ExtendDll
{
public class BeanUtils
{
/// <summary>
/// 将IDictionary赋值给bean对象
/// </summary>
/// <param name="bean"></param>
/// <param name="properties"></param>
public static void Populate(object bean, IDictionary properties)
{
IDictionaryEnumerator ide = properties.GetEnumerator();
while (ide.MoveNext())
{
SetProperty(bean, ide.Key.ToString(), ide.Value);
}
}
/// <summary>
/// 将IDictionary赋值给bean对象
/// </summary>
/// <param name="bean"></param>
/// <param name="properties"></param>
public static void Populate(object bean, IDictionary<string, object> properties)
{
foreach (string prop in properties.Keys)
{
SetProperty(bean, prop, properties[prop]);
}
}
/// <summary>
/// 将NameValueCollection赋值给bean对象
/// </summary>
/// <param name="bean"></param>
/// <param name="properties"></param>
public static void Populate(object bean, NameValueCollection properties)
{
string[] keys = properties.AllKeys;
foreach (string key in keys)
{
SetProperty(bean, key, properties[key]);
}
}
/// <summary>
/// dr赋值给实例
/// </summary>
/// <param name="bean"></param>
/// <param name="dr"></param>
public static void Populate(object bean, DataRow dr)
{
IDictionary<string, object> dic = GetDictionary(dr);
Populate(bean, dic);
}
/// <summary>
/// dt得到实例
/// </summary>
/// <param name="bean"></param>
/// <param name="dt"></param>
/// <returns></returns>
public static List<T> Populate<T>(T bean, DataTable dt)
{
List<T> l = new List<T>();
List<IDictionary<string, object>> list = GetDictionary(dt);
foreach (IDictionary dic in list)
{
T cloneBean = Activator.CreateInstance<T>();
Populate(cloneBean, dic);
l.Add(cloneBean);
}
return l;
}
/// <summary>
/// dt得到实例
/// </summary>
/// <param name="bean"></param>
/// <param name="dt"></param>
/// <returns></returns>
public static List<T> Populate<T>(T bean, XmlDocument dom, string beanTagName, DomPropertyType propType)
{
List<T> l = new List<T>();
List<IDictionary<string, object>> list = GetDictionary(dom, beanTagName, propType);
foreach (IDictionary dic in list)
{
T cloneBean = Activator.CreateInstance<T>();
Populate(cloneBean, dic);
l.Add(cloneBean);
}
return l;
}
/// <summary>
/// 赋值bean
/// </summary>
/// <typeparam name="T"></typeparam>
/// <param name="bean"></param>
/// <returns></returns>
public static T CloneBean<T>(T bean)
{
T o = Activator.CreateInstance<T>();
CopyProperties(o, bean);
return o;
}
public static void CopyProperties(object dest, object orig)
{
IDictionary cache = Describe(orig);
Populate(dest, cache);
}
public static void CopyProperty(object bean, string name, object value)
{
SetProperty(bean, name, value);
}
public static IDictionary Describe(object bean)
{
Hashtable cache = new Hashtable();
Type beantype = bean.GetType();
PropertyInfo[] properties = beantype.GetProperties();
foreach (PropertyInfo pi in properties)
{
string pname = pi.Name;
object obj = pi.GetValue(bean, null);
cache.Add(pname, obj);
}
return cache;
}
/// <summary>
/// 获取对象的属性
/// </summary>
/// <param name="bean"></param>
/// <param name="props"></param>
/// <returns></returns>
public static IDictionary<string, object> GetDictionaryProperties(object bean, string[] props)
{
IDictionary<string, object> dic = new Dictionary<string, object>();
foreach (string prop in props)
{
object obj = GetProperty(bean, prop);
dic.Add(prop, obj);
}
return dic;
}
/// <summary>
/// 获取对象的所有属性
/// </summary>
/// <param name="bean"></param>
/// <returns></returns>
public static IDictionary<string, object> GetAllProperties(object bean)
{
IDictionary<string, object> dic = new Dictionary<string, object>();
Type type = bean.GetType();
PropertyInfo[] pinfos = type.GetProperties();
foreach (PropertyInfo pi in pinfos)
{
dic.Add(pi.Name, pi.GetValue(bean, null));
}
return dic;
}
/// <summary>
/// 获取对象指定的属性值
/// </summary>
/// <param name="bean">对象</param>
/// <param name="name">属性名称</param>
/// <returns></returns>
public static object GetProperty(object bean, string name)
{
Type beantype = bean.GetType();
PropertyInfo pi = beantype.GetProperty(name);
return pi.GetValue(bean, null);
}
public static void SetProperty(object bean, string name, object value)
{
Type beantype = bean.GetType();
PropertyInfo pi = beantype.GetProperty(name);
object destValue = GetDestValue(pi, value);
pi.SetValue(bean, destValue, null);
}
/// <summary>
/// 获取值类型的默认值
/// </summary>
/// <returns></returns>
private static object GetValueTypeDefaultValue(Type type)
{
object defValue;
switch (type.FullName)
{
case "System.Boolean":
defValue = false;
break;
case "System.Byte":
case "System.SByte":
defValue = Byte.MinValue;
break;
case "System.Int16":
case "System.UInt16":
case "System.Int32":
case "System.UInt32":
case "System.Int64":
case "System.UInt64":
case "System.Double":
case "System.Single":
defValue = Convert.ChangeType(0, type);
break;
case "System.Char":
defValue = '0';
break;
case "System.DateTime":
defValue = DateTime.MinValue;
break;
case "System.Decimal":
defValue = Convert.ChangeType(0, type);
break;
default:
defValue = 0;
break;
}
return defValue;
}
/// <summary>
/// 获取类型的最终值
/// </summary>
/// <param name="pi"></param>
/// <param name="value"></param>
/// <returns></returns>
private static object GetDestValue(PropertyInfo pi, object value)
{
Type propType = pi.PropertyType;
if (propType.IsGenericType)
{
//泛型类型(包括可空类型)
Type type = Nullable.GetUnderlyingType(propType);
if (type != null)
{
if (value == DBNull.Value)
{
value = null;
}
#region 作废该数据
//if (type.IsValueType)
//{
// //值类型
// if (value == DBNull.Value || value == null)
// {
// value = GetValueTypeDefaultValue(type);
// }
//}
//else
//{
// //引用类型
// if (value == DBNull.Value)
// {
// value = null;
// }
//}
#endregion
}
}
else
{
if (propType.IsValueType)
{
//值类型
if (value == DBNull.Value || value == null)
{
value = GetValueTypeDefaultValue(propType);
}
}
else
{
//引用类型
if (value == DBNull.Value)
{
value = null;
}
}
}
return value;
}
/// <summary>
/// 将DataRow转换成Hashtable
/// </summary>
/// <param name="row"></param>
/// <returns></returns>
public static IDictionary<string, object> GetDictionary(DataRow row)
{
IDictionary<string, object> dic = new Dictionary<string, object>();
if (row != null)
{
foreach (DataColumn c in row.Table.Columns)
{
dic.Add(c.ColumnName, row[c]);
}
}
return dic;
}
public static List<IDictionary<string, object>> GetDictionary(XmlDocument dom, string beanTagName, DomPropertyType propType)
{
List<IDictionary<string, object>> list = new List<IDictionary<string, object>>();
switch (propType)
{
case DomPropertyType.ElementType:
XmlNodeList nodes = dom.SelectNodes(string.Format(@"//" + beanTagName));
foreach (XmlNode xn in nodes)
{
IDictionary<string, object> dic = new Dictionary<string, object>();
XmlNodeList children = xn.ChildNodes;
foreach (XmlNode xnn in children)
{
dic.Add(xn.Name, xn.InnerText);
}
list.Add(dic);
}
break;
case DomPropertyType.AttributeType:
XmlNodeList ns = dom.SelectNodes(string.Format(@"//" + beanTagName));
foreach (XmlNode xn in ns)
{
IDictionary<string, object> dic = new Dictionary<string, object>();
XmlAttributeCollection attrs = xn.Attributes;
foreach (XmlAttribute attr in attrs)
{
dic.Add(attr.Name, attr.Value);
}
list.Add(dic);
}
break;
default: break;
}
return list;
}
/// <summary>
/// 将DataTable转换成List<Hashtable>
/// </summary>
/// <param name="dt"></param>
/// <returns></returns>
public static List<IDictionary<string, object>> GetDictionary(DataTable dt)
{
List<IDictionary<string, object>> list = new List<IDictionary<string, object>>();
if (dt != null)
{
foreach (DataRow dr in dt.Rows)
{
list.Add(GetDictionary(dr));
}
}
return list;
}
/// <summary>
/// 将DataSet转成List
/// </summary>
/// <param name="ds"></param>
/// <returns></returns>
public static List<List<IDictionary<string, object>>> GetDictionary(DataSet ds)
{
List<List<IDictionary<string, object>>> list = new List<List<IDictionary<string, object>>>();
if (ds != null && ds.Tables.Count > 0)
{
list.Add(GetDictionary(ds.Tables[0]));
}
return list;
}
}
/// <summary>
/// 对象的值,是以节点的形式,还是以属性的形式
/// </summary>
public enum DomPropertyType
{
ElementType = 0, AttributeType = 1
}
}C# 版 BeanUtils
最新推荐文章于 2023-01-31 14:04:04 发布
本文介绍了一个名为BeanUtils的工具类,它提供了多种方法来简化对象属性的赋值过程,如从IDictionary、NameValueCollection、DataRow等数据源填充对象属性,并支持属性复制等功能。
9412

被折叠的 条评论
为什么被折叠?



