using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.IO;
using System.Linq;
using System.Reflection;
using System.Runtime.Serialization;
using System.Runtime.Serialization.Formatters.Binary;
using System.Text;
using System.Xml.Serialization;
namespace IOS.DBUtility
{
public class UtilityHelper
{
/// <summary>
/// 深度复制对象,被复制对象必须是可序列化
/// </summary>
/// <typeparam name="T"></typeparam>
/// <param name="RealObject"></param>
/// <returns></returns>
public static T Clone<T>(T RealObject)
{
using (Stream objectStream = new MemoryStream())
{
IFormatter formatter = new BinaryFormatter();
formatter.Serialize(objectStream, RealObject);
objectStream.Seek(0, SeekOrigin.Begin);
return (T)formatter.Deserialize(objectStream);
}
}
/// <summary>
/// 将实体转换成具有相同结构的DataTable
/// </summary>
/// <typeparam name="T"></typeparam>
/// <param name="model">要转换的实体</param>
/// <returns></returns>
public static DataTable ToDataTable<T>(T model)
{
//检查实体集合不能为空
if (model == null)
{
throw new Exception("需转换的集合为空");
}
//取出第一个实体的所有Propertie
Type entityType = model.GetType();
PropertyInfo[] entityProperties = entityType.GetProperties();
//生成DataTable的structure
//生产代码中,应将生成的DataTable结构Cache起来,此处略
DataTable dt = new DataTable();
for (int i = 0; i < entityProperties.Length; i++)
{
Type colType = entityProperties[i].PropertyType;
if(colType.IsGenericType && colType.GetGenericTypeDefinition()==typeof(Nullable<>))
{
colType = colType.GetGenericArguments()[0];
}
dt.Columns.Add(entityProperties[i].Name,colType);
}
return dt;
}
public static void FullDataRow<T>(T model, DataRow row)
{
//检查实体集合不能为空
if (model == null)
{
throw new Exception("需转换的集合为空");
}
//取出第一个实体的所有Propertie
Type entityType = model.GetType();
PropertyInfo[] entityProperties = entityType.GetProperties();
for (int i = 0; i < entityProperties.Length; i++)
{
object value= entityProperties[i].GetValue(model, null);
if(value==null)
{
value = DBNull.Value;
}
row[entityProperties[i].Name] = value;
}
}
/// <summary>
/// 用DataRow的数据设置实例
/// </summary>
/// <typeparam name="T"></typeparam>
/// <param name="model"></param>
/// <param name="sourceDataRow"></param>
public static void SetModel<T>(T model, DataRow sourceDataRow)
{
Type entityType = model.GetType();
PropertyInfo[] entityProperties = entityType.GetProperties(BindingFlags.Public | BindingFlags.Instance | BindingFlags.IgnoreCase);
foreach (PropertyInfo info in entityProperties)
{
if (sourceDataRow.Table.Columns.Contains(info.Name))
{
if (sourceDataRow[info.Name] != DBNull.Value)
{
info.SetValue(model, sourceDataRow[info.Name], null);
}
}
}
}
/// <summary>
/// 得到size的字段名FieldName,当size为空时,FieldName="Empty"
/// </summary>
/// <param name="size"></param>
/// <returns></returns>
public static string GetFieldName(string size)
{
if (string.IsNullOrEmpty(size))
{
return "Empty";
}
else
{
return size.ToString();
}
}
/// <summary>
/// 获取时间戳
/// </summary>
/// <returns></returns>
public static string GetTimeStamp()
{
TimeSpan ts = DateTime.UtcNow - new DateTime(1970, 1, 1, 0, 0, 0, 0);
return Convert.ToInt64(ts.TotalSeconds).ToString();
}
/// <summary>
/// 获取类中的属性值
/// </summary>
/// <param name="FieldName"></param>
/// <param name="obj"></param>
/// <returns></returns>
public static string GetModelValue(string FieldName, object obj)
{
try
{
Type Ts = obj.GetType();
object o = Ts.GetProperty(FieldName).GetValue(obj, null);
string Value = Convert.ToString(o);
if (string.IsNullOrEmpty(Value)) return null;
return Value;
}
catch
{
return null;
}
}
/// <summary>
/// 设置类中的属性值
/// </summary>
/// <param name="FieldName"></param>
/// <param name="obj"></param>
/// <returns></returns>
public static bool SetModelValue(string FieldName, object Value, object obj)
{
try
{
Type Ts = obj.GetType();
object v = Convert.ChangeType(Value, Ts.GetProperty(FieldName).PropertyType);
Ts.GetProperty(FieldName).SetValue(obj, v, null);
return true;
}
catch
{
return false;
}
}
/// <summary>
/// 将原对象的属性值赋值到目标对象对应的属性
/// </summary>
/// <typeparam name="T"></typeparam>
/// <param name="source"></param>
/// <param name="target"></param>
/// <returns></returns>
public static T CopyToModel<T>(T source, T target)
{
Type tSource = source.GetType();
Type tTarget = target.GetType();
foreach (System.Reflection.PropertyInfo p in tSource.GetProperties(BindingFlags.Public | BindingFlags.Instance | BindingFlags.IgnoreCase))
{
if (p.CanWrite)
{
try
{
object value = p.GetValue(source, null);
tTarget.GetProperty(p.Name).SetValue(target, value, null);
}
catch
{
continue;
}
}
}
return target;
}
/// <summary>
/// 判断控件是否处在设计模式下,注意:当添加的控件将会被其它控件调用时,应当在控件的构造函数和Load事件进行判断处理(仅对用户添加的代码)
/// </summary>
/// <returns></returns>
public static bool IsDesignMode()
{
bool returnFlag = false;
#if DEBUG
if (LicenseManager.UsageMode == LicenseUsageMode.Designtime)
{
returnFlag = true;
}
else if (System.Diagnostics.Process.GetCurrentProcess().ProcessName == "devenv")
{
returnFlag = true;
}
#endif
return returnFlag;
}
/// <summary>
/// 把过滤出来的数据生成到新的DataTable并返回
/// </summary>
/// <param name="dt"></param>
/// <param name="strCondition">过滤条件</param>
/// <returns></returns>
public static DataTable GetNewTable(DataTable dt, string strCondition)
{
DataTable tempDT = dt.Clone();
DataRow[] rows = dt.Select(strCondition);
foreach (DataRow dr in rows)
{
tempDT.ImportRow(dr);
}
return tempDT;
}
/// <summary>
/// 得到以Sql语法形式的字符串,以便用于Sql语句查询
/// </summary>
/// <param name="items">以逗号分隔的字符串</param>
/// <returns></returns>
public static string GetStringBySql(string items)
{
if (string.IsNullOrEmpty(items))
{
return items;
}
else
{
StringBuilder results = new StringBuilder();
foreach (string item in items.Split(',').ToList())
{
if (results.Length == 0)
{
results.AppendFormat("'{0}'", item);
}
else
{
results.AppendFormat(",'{0}'", item);
}
}
return results.ToString();
}
}
#region 类型转换
#region 日期
/// <summary>
/// 转换成日期
/// </summary>
/// <param name="value">日期值</param>
/// <returns></returns>
public static DateTime ToDateTime(object value)
{
if (DBHelper.IsNull(value))
{
return DBHelper.MinDate;
}
else
{
DateTime result = DBHelper.MinDate;
return DateTime.TryParse(value.ToString(), out result) ? result : DBHelper.MinDate;
}
}
#endregion 日期结束
public static double ToDouble(object value)
{
if (DBHelper.IsNull(value))
{
return 0;
}
else
{
double result = 0;
return double.TryParse(value.ToString(), out result) ? result : 0;
}
}
public static int ToInt(object value)
{
if (DBHelper.IsNull(value))
{
return 0;
}
else
{
int result = 0;
return int.TryParse(value.ToString(), out result) ? result : 0;
}
}
public static bool ToBool(object value)
{
if (DBHelper.IsNull(value))
{
return false;
}
else
{
bool result = false;
return bool.TryParse(value.ToString(), out result) ? result : false;
}
}
public static string ToString(object value)
{
if (DBHelper.IsNull(value))
{
return string.Empty;
}
else
{
return value.ToString().Trim();
}
}
#endregion 类型转换结束
}
}