/// <summary> /// Copies the specified source. /// </summary> /// <param name="source">The source.</param> /// <param name="target">The target.</param> /// <param name="progressDelegate">The progress delegate.</param> /// <remarks>Documented by Dev05, 2012-01-11</remarks> public static void Copy(ICopy source, ICopy target, CopyToProgress progressDelegate) { if (source.GetType() != target.GetType()) throw new ArgumentException("Source and Target must be the same type!"); Copy(source, target, source.GetType(), progressDelegate); }
/// <summary> /// Copies the specified source. /// </summary> /// <param name="source">The source.</param> /// <param name="target">The target.</param> /// <param name="type">The type the source and target should be interpreded as.</param> /// <param name="progressDelegate">The progress delegate.</param> public static void Copy(ICopy source, ICopy target, Type type, CopyToProgress progressDelegate) { if (!(type.IsAssignableFrom(source.GetType()) && type.IsAssignableFrom(target.GetType()))) { throw new ArgumentException("Source and Target must implement " + type.ToString()); } foreach (PropertyInfo info in type.GetProperties()) { if (type.GetProperty(info.Name).IsDefined(typeof(IgnoreCopyAttribute), true) || source.GetType().GetProperty(info.Name).IsDefined(typeof(IgnoreCopyAttribute), true) || target.GetType().GetProperty(info.Name).IsDefined(typeof(IgnoreCopyAttribute), true)) { continue; } if (typeof(ICopy).IsAssignableFrom(info.PropertyType)) { ICopy copyObject = (info.GetValue(source, null) as ICopy); if (copyObject != null) { copyObject.CopyTo(info.GetValue(target, null) as ICopy, progressDelegate); } } if (info.IsDefined(typeof(ValueCopyAttribute), true)) { object value = info.GetValue(source, null); if (value != null) { info.SetValue(target, value, null); } } } }
/// <summary> /// Copies the specified source. /// </summary> /// <param name="source">The source.</param> /// <param name="target">The target.</param> /// <param name="progressDelegate">The progress delegate.</param> /// <remarks>Documented by Dev05, 2012-01-11</remarks> public static void Copy(ICopy source, ICopy target, CopyToProgress progressDelegate) { if (source.GetType() != target.GetType()) { throw new ArgumentException("Source and Target must be the same type!"); } Copy(source, target, source.GetType(), progressDelegate); }
/// <summary> /// Copies the specified source. /// </summary> /// <param name="source">The source.</param> /// <param name="target">The target.</param> /// <param name="type">The type the source and target should be interpreded as.</param> /// <param name="progressDelegate">The progress delegate.</param> public static void Copy(ICopy source, ICopy target, Type type, CopyToProgress progressDelegate) { if (!(type.IsAssignableFrom(source.GetType()) && type.IsAssignableFrom(target.GetType()))) throw new ArgumentException("Source and Target must implement " + type.ToString()); foreach (PropertyInfo info in type.GetProperties()) { if (type.GetProperty(info.Name).IsDefined(typeof(IgnoreCopyAttribute), true) || source.GetType().GetProperty(info.Name).IsDefined(typeof(IgnoreCopyAttribute), true) || target.GetType().GetProperty(info.Name).IsDefined(typeof(IgnoreCopyAttribute), true)) continue; if (typeof(ICopy).IsAssignableFrom(info.PropertyType)) { ICopy copyObject = (info.GetValue(source, null) as ICopy); if (copyObject != null) copyObject.CopyTo(info.GetValue(target, null) as ICopy, progressDelegate); } if (info.IsDefined(typeof(ValueCopyAttribute), true)) { object value = info.GetValue(source, null); if (value != null) info.SetValue(target, value, null); } } }
/// <summary> /// 将对象转化为json格式字符串 /// </summary> /// <typeparam name="T"></typeparam> /// <param name="obj"></param> /// <returns></returns> public static T CopyTo <T>(this ICopy obj) where T : new() { if (obj == null) { return(default(T)); } var result = new T(); var sourceProps = obj.GetType().GetProperties(BindingFlags.Public | BindingFlags.Instance); var targetProps = typeof(T).GetProperties(BindingFlags.Public | BindingFlags.Instance); foreach (var tp in targetProps) { if (!tp.CanWrite) { continue; } foreach (var sp in sourceProps) { if (!string.Equals(tp.Name, sp.Name, StringComparison.OrdinalIgnoreCase)) { continue; } tp.SetValue(result, sp.GetValue(obj)); break; } } return(result); }