// *********************************************************************** // //对象COPY/初始化帮助,通常是防止从视图中传过来的对象属性为空,这其赋初始值 // // *********************************************************************** using System; using System.Reflection; namespace CommonTool { public static class ObjectHelper { public static T CopyTo(this object source) where T:class, new() { var result = SetDefault(new T()) as T ?? new T(); source.CopyTo(result); return result; } public static void CopyTo(this object source, T target) where T : class,new() { if (source == null) return; if (target == null) { target = new T(); } foreach (var property in target.GetType().GetProperties()) { var propertyValue = source.GetType().GetProperty(property.Name).GetValue(source, null); if (propertyValue != null) { if (propertyValue.GetType().IsClass) { //EntityFactory.CreateEntity<> (); } target.GetType().InvokeMember(property.Name, BindingFlags.SetProperty, null, target, new[] { propertyValue }); } } foreach (var field in target.GetType().GetFields()) { var fieldValue = source.GetType().GetField(field.Name).GetValue(source); if (fieldValue != null) { target.GetType().InvokeMember(field.Name, BindingFlags.SetField, null, target, new[] { fieldValue }); } } } private static object SetDefault(object obj) { PropertyInfo[] fields = obj.GetType().GetProperties(); foreach (PropertyInfo v in fields) { if (v.PropertyType == typeof(string) && v.GetValue(obj) == null) { v.SetValue(obj, ""); } else if (v.PropertyType == typeof(DateTime) && (v.GetValue(obj) == null || (DateTime)v.GetValue(obj) == DateTime.MinValue)) { v.SetValue(obj, DateTime.Now); } //else if (v.PropertyType.IsClass && v.GetValue(obj) == null) //{ // EntityFactory.CreateEntity<>(); //} } return obj; } } public abstract class EntityFactory { public static T CreateEntity() where T : class, new() { T t = Activator.CreateInstance(); PropertyInfo[] properties = typeof(T).GetProperties(); foreach (PropertyInfo pi in properties) { Type type = pi.PropertyType; if (type.IsArray) { pi.SetValue(t, Activator.CreateInstance(type, 10), null); } else { pi.SetValue(t, Activator.CreateInstance(type), null); } } return t; } } }