/// <summary> /// 将当前对象所有的属性值复制到 <paramref name="target"/>。 /// </summary> /// <typeparam name="TTarget">目标的数据类型。</typeparam> /// <param name="source">复制的源对象。</param> /// <param name="target">复制的目标对象。</param> /// <param name="targetStrategy">复制目标的策略。</param> /// <returns> <paramref name="target"/>。</returns> public static TTarget CopyTo <TTarget>(this object source, TTarget target, CopyToStrategy targetStrategy = CopyToStrategy.Default) { if (source == null) { throw new ArgumentNullException(nameof(source)); } if (target == null) { throw new ArgumentNullException(nameof(target)); } var sMapper = TypeMapper.Create(source.GetType()); var tMapper = TypeMapper.Create(target.GetType()); foreach (var sProperty in sMapper.Properties) { var tProperty = tMapper[sProperty.Name]; if (tProperty == null) { continue; } if (targetStrategy == CopyToStrategy.OnlyPrimaryKey && !tProperty.IsKey || (targetStrategy == CopyToStrategy.ExcludePrimaryKey && tProperty.IsKey) || !tProperty.Property.CanWrite) { continue; } object sValue = sProperty.GetValue(source, false); if (targetStrategy == CopyToStrategy.OnlyChangeValues) { if (object.Equals(sValue, sProperty.TypeDefaultValue)) { continue; } } var spType = sProperty.Property.PropertyType; var tpType = tProperty.Property.PropertyType; if (spType != tpType) { if (tpType.IsValueType && sValue == null) { //throw new ArgumentNullException("{0}.{1}".Fmt(sMapper.Type.Name, sProperty.Property.Name), "目标属性 {0}.{1} 不能为 null 值。".Fmt(tMapper.Type.Name, tProperty.Property.Name)); continue; } tProperty.SetValue(target, tpType.ChangeType(sValue), false); } else { tProperty.SetValue(target, sValue, false); } } return(target); }
/// <summary> /// 将当前对象所有的属性值复制成一个新的 <typeparamref name="TTarget"/> 实例。 /// </summary> /// <typeparam name="TTarget">新的数据类型。</typeparam> /// <param name="source">复制的源对象。</param> /// <param name="targetStrategy">复制目标的策略。</param> /// <returns><typeparamref name="TTarget"/> 的心实例。</returns> public static TTarget CopyTo <TTarget>(this object source, CopyToStrategy targetStrategy = CopyToStrategy.Default) { if (source == null) { return(default(TTarget)); } TTarget t2 = Activator.CreateInstance <TTarget>(); return(CopyTo(source, t2, targetStrategy)); }
/// <summary> /// 将 <paramref name="target"/> 所有的属性值复制到当前对象。 /// </summary> /// <typeparam name="TSource">源的数据类型。</typeparam> /// <typeparam name="TTarget">目标的数据类型。</typeparam> /// <param name="source">复制的源对象。</param> /// <param name="target">复制的目标对象。</param> /// <param name="targetStrategy">复制目标的策略。</param> /// <returns> <paramref name="source"/>。</returns> public static TSource CopyFrom <TSource, TTarget>(this TSource source, TTarget target, CopyToStrategy targetStrategy = CopyToStrategy.Default) => CopyTo <TSource>(target, source, targetStrategy);
/// <summary> /// 将当前对象所有的属性值复制成一个新的 <typeparamref name="TTarget"/> 实例。 /// </summary> /// <typeparam name="TTarget">目标的数据类型。</typeparam> /// <param name="source">复制的源对象。</param> /// <param name="targetStrategy">复制目标的策略。</param> /// <returns><typeparamref name="TTarget"/> 的新实例。</returns> public static TTarget DeepCopy <TTarget>(this TTarget source, CopyToStrategy targetStrategy = CopyToStrategy.Default) { return(source.CopyTo <TTarget>(targetStrategy)); }