using CYQ.Data.Json;
using CYQ.Data.SQL;
using CYQ.Data.Table;
using System;
using System.Collections.Generic;
using System.Data.Common;
using System.Data.SqlTypes;
using System.IO;
using System.Reflection;
using System.Runtime.Serialization.Formatters.Binary;
using System.Text;
using System.Web;
namespace CYQ.Data.Tool
{
///
/// 类型转换(支持json转实体)
///
public static partial class ConvertTool
{
///
/// 类型转换(精准强大)
///
public static T ChangeType(object value)
{
return (T)ChangeType(value, typeof(T));
}
///
/// 类型转换(精准强大)
///
/// 值处理
/// 类型
///
public static object ChangeType(object value, Type t)
{
if (t == null) { return null; }
//对基础类型进行单独处理,提升转化性能。
switch (t.Name)
{
case "Byte":
return ToByte(value);
case "Int16":
return ToInt16(value);
case "Int32":
return ToInt32(value);
case "Int64":
return ToInt64(value);
case "String":
return ToString(value);
case "DateTime":
return ToDateTime(value);
case "Boolean":
return ToBoolean(value);
case "Guid":
return ToGuid(value);
case "Single":
return ToSingle(value);
case "Double":
return ToDouble(value);
case "Decimal":
return ToDecimal(value);
}
if (t.IsEnum)
{
return ToEnum(value, t);
}
if (value == null)
{
return t.IsValueType ? Activator.CreateInstance(t) : null;
}
if (t.FullName == "System.Object")
{
return value;
}
if (t.FullName == "System.Type")
{
return (Type)value;
}
if (t.FullName == "System.IO.Stream" && value is HttpPostedFile)
{
return ((HttpPostedFile)value).InputStream;
}
string strValue = Convert.ToString(value);
if (t.IsGenericType && t.Name.StartsWith("Nullable"))
{
t = Nullable.GetUnderlyingType(t);
if (strValue == "")
{
return null;
}
}
if (t.FullName == "System.Text.StringBuilder")
{
return value as StringBuilder;
}
if (t.FullName == "System.Text.Encoding")
{
return value as Encoding;
}
if (strValue.Trim() == "")
{
if (t.Name.EndsWith("[]")) { return null; }
return Activator.CreateInstance(t);
}
if (t.IsValueType)
{
strValue = strValue.Trim('\r', '\n', '\t', ' ');
return Convert.ChangeType(strValue, t);
}
else
{
Type valueType = value.GetType();
//if(valueType.IsEnum && t.is)
if (valueType.FullName != t.FullName)
{
if ((strValue.StartsWith("{") || strValue.StartsWith("[")) && (strValue.EndsWith("}") || strValue.EndsWith("]")))
{
return JsonHelper.ToEntity(t, strValue, EscapeOp.Default);
}
switch (ReflectTool.GetSystemType(ref t))
{
case SysType.Custom:
return MDataRow.CreateFrom(value).ToEntity(t);
case SysType.Collection:
return MDataTable.CreateFrom(value).ToList(t);
case SysType.Generic:
if (t.Name.StartsWith("List") || t.Name.StartsWith("IList") || t.Name.StartsWith("MList"))
{
return MDataTable.CreateFrom(value).ToList(t);
}
return MDataRow.CreateFrom(value).ToEntity(t);
case SysType.Array:
if (t.Name == "Byte[]")
{
if (valueType.Name == "String")
{
return Convert.FromBase64String(strValue);
}
using (MemoryStream ms = new MemoryStream())
{
new BinaryFormatter().Serialize(ms, value);
return ms.ToArray();
}
}
break;
}
}
return Convert.ChangeType(value, t);
}
}
}
}