using System; using System.Collections.Generic; using System.Linq; using System.Reflection; using System.Text; using System.Threading.Tasks; using System.Web.Script.Serialization; namespace Com.AppCode.Helper { public class ObjectHelper { #region Invoking /// <summary> /// test /// </summary> public void test() { var obj = new { id = 1, name = "张三", sex = 1, age = 22 }; //转换 var userModel = ConvertObject<user>(obj); } /// <summary> /// 用户 /// </summary> public class user { /// <summary> /// 编号 /// </summary> public int id { set; get; } /// <summary> /// 姓名 /// </summary> public string name { set; get; } /// <summary> /// 性别 /// </summary> public int sex { set; get; } /// <summary> /// 年龄 /// </summary> public int age { set; get; } } #endregion #region Method1 /// <summary> /// 将object对象转换为实体对象 /// </summary> /// <typeparam name="T">实体对象类名</typeparam> /// <param name="asObject">object对象</param> /// <returns></returns> public T ConvertObject<T>(object asObject) where T : new() { //创建实体对象实例 var t = Activator.CreateInstance<T>(); if (asObject != null) { Type type = asObject.GetType(); //遍历实体对象属性 foreach (var info in typeof(T).GetProperties()) { object obj = null; //取得object对象中此属性的值 var val = type.GetProperty(info.Name)?.GetValue(asObject); if (val != null) { //非泛型 if (!info.PropertyType.IsGenericType) obj = Convert.ChangeType(val, info.PropertyType); else//泛型Nullable<> { Type genericTypeDefinition = info.PropertyType.GetGenericTypeDefinition(); if (genericTypeDefinition == typeof(Nullable<>)) { obj = Convert.ChangeType(val, Nullable.GetUnderlyingType(info.PropertyType)); } else { obj = Convert.ChangeType(val, info.PropertyType); } } info.SetValue(t, obj, null); } } } return t; } #endregion #region Method2 /// <summary> /// 将object对象转换为实体对象 /// </summary> /// <typeparam name="T">实体对象类名</typeparam> /// <param name="asObject">object对象</param> /// <returns></returns> public static T ConvertObjectByJson<T>(object asObject) where T : new() { var serializer = new JavaScriptSerializer(); //将object对象转换为json字符 var json = serializer.Serialize(asObject); //将json字符转换为实体对象 var t = serializer.Deserialize<T>(json); return t; } #endregion #region Method3 /// <summary> /// 将object尝试转为指定对象 /// </summary> /// <param name="data"></param> /// <returns></returns> public static T ConvertObjToModel<T>(object data) where T : new() { if (data == null) return new T(); // 定义集合 T result = new T(); // 获得此模型的类型 Type type = typeof(T); string tempName = ""; // 获得此模型的公共属性 PropertyInfo[] propertys = result.GetType().GetProperties(); foreach (PropertyInfo pi in propertys) { tempName = pi.Name; // 检查object是否包含此列 // 判断此属性是否有Setter if (!pi.CanWrite) continue; try { object value = GetPropertyValue(data, tempName); if (value != DBNull.Value) { Type tempType = pi.PropertyType; pi.SetValue(result, GetDataByType(value, tempType), null); } } catch { } } return result; } /// <summary> /// 获取一个类指定的属性值 /// </summary> /// <param name="info">object对象</param> /// <param name="field">属性名称</param> /// <returns></returns> public static object GetPropertyValue(object info, string field) { if (info == null) return null; Type t = info.GetType(); IEnumerable<System.Reflection.PropertyInfo> property = from pi in t.GetProperties() where pi.Name.ToLower() == field.ToLower() select pi; return property.First().GetValue(info, null); } /// <summary> /// 将数据转为制定类型 /// </summary> /// <typeparam name="T"></typeparam> /// <param name="data1"></param> /// <returns></returns> public static object GetDataByType(object data1, Type itype, params object[] myparams) { object result = new object(); try { if (itype == typeof(decimal)) { result = Convert.ToDecimal(data1); if (myparams.Length > 0) { result = Convert.ToDecimal(Math.Round(Convert.ToDecimal(data1), Convert.ToInt32(myparams[0]))); } } else if (itype == typeof(double)) { if (myparams.Length > 0) { result = Convert.ToDouble(Math.Round(Convert.ToDouble(data1), Convert.ToInt32(myparams[0]))); } else { result = double.Parse(Convert.ToDecimal(data1).ToString("0.00")); } } else if (itype == typeof(Int32)) { result = Convert.ToInt32(data1); } else if (itype == typeof(DateTime)) { result = Convert.ToDateTime(data1); } else if (itype == typeof(Guid)) { result = new Guid(data1.ToString()); } else if (itype == typeof(string)) { result = data1.ToString(); } } catch { if (itype == typeof(decimal)) { result = 0; } else if (itype == typeof(double)) { result = 0; } else if (itype == typeof(Int32)) { result = 0; } else if (itype == typeof(DateTime)) { result = null; } else if (itype == typeof(Guid)) { result = Guid.Empty; } else if (itype == typeof(string)) { result = ""; } } return result; } #endregion } }