增加Object扩展方法CloneTo和CloneFrom方法可以将原对象属性浅表复制到目标对象
This commit is contained in:
		
							parent
							
								
									ee3e44afb3
								
							
						
					
					
						commit
						520abc3454
					
				
							
								
								
									
										58
									
								
								Falcon.SugarApi.Test/ObjectExtendTest.cs
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										58
									
								
								Falcon.SugarApi.Test/ObjectExtendTest.cs
									
									
									
									
									
										Normal file
									
								
							@ -0,0 +1,58 @@
 | 
			
		||||
using Microsoft.VisualStudio.TestTools.UnitTesting;
 | 
			
		||||
using System;
 | 
			
		||||
using System.Collections.Generic;
 | 
			
		||||
using System.Linq;
 | 
			
		||||
using System.Text;
 | 
			
		||||
using System.Threading.Tasks;
 | 
			
		||||
using Falcon.SugarApi;
 | 
			
		||||
 | 
			
		||||
namespace Falcon.SugarApi.Test
 | 
			
		||||
{
 | 
			
		||||
    [TestClass]
 | 
			
		||||
    public class ObjectExtendTest
 | 
			
		||||
    {
 | 
			
		||||
        [TestMethod]
 | 
			
		||||
        public void CloneToTest() {
 | 
			
		||||
            var s = new SourceClass { };
 | 
			
		||||
            var t = new TargetClass { };
 | 
			
		||||
            t.ica.ItemA = "itemb";
 | 
			
		||||
 | 
			
		||||
            Assert.IsTrue(t.ica.ItemA == "itemb");
 | 
			
		||||
 | 
			
		||||
            var r = s.CloneTo(t);
 | 
			
		||||
 | 
			
		||||
            Assert.IsNotNull(s);
 | 
			
		||||
            Assert.IsNotNull(r);
 | 
			
		||||
            Assert.IsNotNull(t);
 | 
			
		||||
            Assert.IsTrue(s.ia == t.ia, $"a.id:{s.ia},t.ia:{t.ia}");
 | 
			
		||||
            Assert.IsTrue(t.ia == 1);
 | 
			
		||||
            Assert.IsTrue(s.sa == t.sa);
 | 
			
		||||
            Assert.IsTrue(s.sc == "sc");
 | 
			
		||||
            Assert.IsTrue(t.sd == "sd");
 | 
			
		||||
            Assert.IsTrue(s.ica.ItemA == "itema");
 | 
			
		||||
            Assert.IsTrue(t.ica.ItemA == "itema");
 | 
			
		||||
            Assert.IsTrue(t.ica.Equals(s.ica));
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    public class SourceClass
 | 
			
		||||
    {
 | 
			
		||||
        public int ia { get; set; } = 1;
 | 
			
		||||
        public string sa { get; set; } = "sa";
 | 
			
		||||
        public string sc { get; set; } = "sc";
 | 
			
		||||
        public ItemClass ica { get; set; } = new ItemClass();
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    public class TargetClass
 | 
			
		||||
    {
 | 
			
		||||
        public int ia { get; set; }
 | 
			
		||||
        public string sa { get; set; }
 | 
			
		||||
        public string sd { get; set; } = "sd";
 | 
			
		||||
        public ItemClass ica { get; set; } = new ItemClass();
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    public class ItemClass
 | 
			
		||||
    {
 | 
			
		||||
        public string ItemA { get; set; } = "itema";
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
							
								
								
									
										42
									
								
								Falcon.SugarApi/ObjectExtend.cs
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										42
									
								
								Falcon.SugarApi/ObjectExtend.cs
									
									
									
									
									
										Normal file
									
								
							@ -0,0 +1,42 @@
 | 
			
		||||
using System;
 | 
			
		||||
using System.Diagnostics.CodeAnalysis;
 | 
			
		||||
using System.Linq;
 | 
			
		||||
 | 
			
		||||
namespace Falcon.SugarApi
 | 
			
		||||
{
 | 
			
		||||
    /// <summary>
 | 
			
		||||
    /// Object类型扩展方法
 | 
			
		||||
    /// </summary>
 | 
			
		||||
    public static class ObjectExtend
 | 
			
		||||
    {
 | 
			
		||||
        /// <summary>
 | 
			
		||||
        /// 对source进行浅表复制,并复制到target中
 | 
			
		||||
        /// </summary>
 | 
			
		||||
        /// <typeparam name="TSource">原对象类型</typeparam>
 | 
			
		||||
        /// <param name="source">原对象</param>
 | 
			
		||||
        /// <param name="target">目标对象</param>
 | 
			
		||||
        public static TSource CloneTo<TSource>(this TSource source, [NotNull] object target) where TSource : class {
 | 
			
		||||
            _ = source ?? throw new ArgumentNullException(nameof(source));
 | 
			
		||||
            _ = target ?? throw new ArgumentNullException(nameof(target));
 | 
			
		||||
            var all = from s in source.GetType().GetProperties()
 | 
			
		||||
                      join t in target.GetType().GetProperties() on s.Name equals t.Name
 | 
			
		||||
                      select new { s, t };
 | 
			
		||||
            foreach (var item in all) {
 | 
			
		||||
                item.t.SetValue(target, Convert.ChangeType(item.s.GetValue(source), item.s.PropertyType));
 | 
			
		||||
            }
 | 
			
		||||
            return source;
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        /// <summary>
 | 
			
		||||
        /// 从原对象中浅表复制属性值
 | 
			
		||||
        /// </summary>
 | 
			
		||||
        /// <typeparam name="Ttarget">目标对象类型</typeparam>
 | 
			
		||||
        /// <param name="target">目标对象</param>
 | 
			
		||||
        /// <param name="source">原对象</param>
 | 
			
		||||
        /// <returns>目标对象</returns>
 | 
			
		||||
        public static Ttarget CloneFrom<Ttarget>(this Ttarget target, object source) where Ttarget : class {
 | 
			
		||||
            source.CloneTo(target);
 | 
			
		||||
            return target;
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user