Beispiel #1
0
        /// <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);
        }
Beispiel #2
0
        /// <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));
        }
Beispiel #3
0
 /// <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);
Beispiel #4
0
 /// <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));
 }