• OO Mapper 实践(下篇)


      上篇介绍了OO Mapper 最核心的映射,简单类型映射,这篇将介绍的复合类型的映射。

          1. Dictionary - > Dictionary 字典类型分为:IDictionary,IDictioanry<TKey,TValue>

            public class SourceValue
            {
                public int Value { get; set; }
            }
    
            public class DestValue
            {
                public int Value { get; set; }
            }
    
            
    
            [Test]
            public void Example()
            {
                var sourceDict = new Dictionary<string, SourceValue>
    				{
    					{"First", new SourceValue {Value = 5}},
    					{"Second", new SourceValue {Value = 10}},
    					{"Third", new SourceValue {Value = 15}}
    				};
    
                var destDict = Mapper.Map<Dictionary<string, SourceValue>, IDictionary<string, DestValue>>(sourceDict);
                Assert.AreEqual(3, destDict.Count);
                Assert.AreEqual(destDict["First"].Value, 5);
                Assert.AreEqual(destDict["Second"].Value, 10);
                Assert.AreEqual(destDict["Third"].Value, 15);
                
            }
    
            [Test]
            public void Example2()
            {
                var sourceDict = new Dictionary<int, SourceValue>
    				{
    					{1, new SourceValue {Value = 5}},
    					{2, new SourceValue {Value = 10}},
    					{3, new SourceValue {Value = 15}}
    				};
    
                var destDict = Mapper.Map<Dictionary<int, SourceValue>, IDictionary<string, DestValue>>(sourceDict);
                Assert.AreEqual(3, destDict.Count);
                Assert.AreEqual(destDict["1"].Value, 5);
                Assert.AreEqual(destDict["2"].Value, 10);
                Assert.AreEqual(destDict["3"].Value, 15);
    
            }
    
            enum sourceKey
            {
                First,
                Second,
                Third,
            }
    
            enum destKey
            {
                First,
                Second,
                Third,
            }
    
            public void Example3()
            {
                var sourceDict = new Dictionary<sourceKey, SourceValue>
    				{
    					{sourceKey.First, new SourceValue {Value = 5}},
    					{sourceKey.Second, new SourceValue {Value = 10}},
    					{sourceKey.Third, new SourceValue {Value = 15}}
    				};
    
                var destDict = Mapper.Map<Dictionary<sourceKey, SourceValue>, IDictionary<destKey, DestValue>>(sourceDict);
                Assert.AreEqual(3, destDict.Count);
                Assert.AreEqual(destDict[destKey.First].Value, 5);
                Assert.AreEqual(destDict[destKey.Second].Value, 10);
                Assert.AreEqual(destDict[destKey.Third].Value, 15);
    
            }
    
            public void Example4()
            {
                var sourceDict = new Hashtable()
    				{
    					{1, new SourceValue {Value = 5}},
    					{2, new SourceValue {Value = 10}},
    					{3, new SourceValue {Value = 15}}
    				};
    
                var destDict = Mapper.Map<Hashtable, IDictionary<string, DestValue>>(sourceDict);
                Assert.AreEqual(3, destDict.Count);
                Assert.AreEqual(destDict["1"].Value, 5);
                Assert.AreEqual(destDict["2"].Value, 10);
                Assert.AreEqual(destDict["3"].Value, 15);
    
            }
    
            public void Example5()
            {
                var sourceDict = new Dictionary<int, SourceValue>()
    				{
    					{1, new SourceValue {Value = 5}},
    					{2, new SourceValue {Value = 10}},
    					{3, new SourceValue {Value = 15}}
    				};
    
                var destDict = Mapper.Map<Dictionary<int, SourceValue>, Hashtable>(sourceDict);
                Assert.AreEqual(3, destDict.Count);
                Assert.AreEqual((destDict[1] as SourceValue).Value, 5);
                Assert.AreEqual((destDict[2] as SourceValue).Value, 10);
                Assert.AreEqual((destDict[3] as SourceValue).Value, 15);
    
            }
    

      2. Class -> Dictionary

           public class Person1
            {
                public string Name { get; set; }
                public int Age { get; set; }
                public bool Sex { get; set; }
            }
    
            [Test]
            public void SimpleTest()
            {
                var source = new Person1 { Name = "Kevin", Age = 30, Sex = true };
                var dst = Mapper.Map<Person1, IDictionary<string, object>>(source);
    
                Assert.AreEqual(dst["Name"], source.Name);
                Assert.AreEqual(dst["Age"], source.Age);
                Assert.AreEqual(dst["Sex"], source.Sex);
            }
    
            [Test]
            public void IgnoreMemberTest()
            {
                var source = new Person1 { Name = "Kevin", Age = 30, Sex = true };
                var dst = Mapper
                    .CreateMapper<Person1, IDictionary<string, object>>()
                    .IgnoreSourceMember(x => x.Sex)
                    .Map(source);
    
                Assert.AreEqual(dst["Name"], source.Name);
                Assert.AreEqual(dst["Age"], source.Age);
                Assert.IsFalse(dst.ContainsKey("Sex"));
            }
    

      3.  Dictionary -> Class 简单转换

    public class TeamSearchCondition
            {
                public string BusinessCategory;
                public string NIROI;
                public string Lob;
                [Splite(',')]
                public int[] Product;
                public string FormName;
            }
    
            [Test]
            public void Test()
            {
                var source = new Dictionary<string, string>();
                source["BusinessCategory"] = "kevin";
                source["NIROI"] = "30";
                source["Lob"] = "true";
                source["Product"] = "1,2";
                source["FormName"] = "true";
    
                var dst = Mapper.Map<IDictionary<string, string>, TeamSearchCondition>(source);
    
                Assert.IsNotNull(dst);
    
                Assert.IsNotNull(dst.Product != null);
                Assert.AreEqual(2, dst.Product.Length);
                Assert.AreEqual(1, dst.Product[0]);
                Assert.AreEqual(2, dst.Product[1]);
            }

        4. Dictioanry -> Class 复杂一点的转换

     public class Book
            {
                public int BookId { get; set; }
                public string BookName { get; set; }
                public Author Author { get; set; }
                public DateTime PublishedDate { get; set; }
            }
    
            public class Author
            {
                public int AuthorId { get; set; }
                public string AuthorName { get; set; }
                public string Nation { get; set; }
            }
    
            [Test]
            public void TestSubProperty()
            {
                var sourceDict = new Dictionary<string, string>
    				{
    					{"BookName", "设计模式"},
    					{"Author.AuthorName", "四人帮"},
    					{"Author.AuthorId", "3"}
    				};
    
                var destDict = Mapper.Map<Dictionary<string, string>, Book>(sourceDict);
    
                Assert.NotNull(destDict);
                Assert.AreEqual("设计模式", destDict.BookName);
                Assert.AreEqual("四人帮", destDict.Author.AuthorName);
                Assert.AreEqual(3, destDict.Author.AuthorId);
            }
    

      5. DataReader -> List

           public enum TestClassStatus
            {
                First = 0,
                Second = 1
            }
    
            class TestClass
            {
                public int Id { get; set; }
                public string Name;
    
                public TestClassStatus? Status;
                public Guid Guid;
            }
    
           
    
            [Test]
            public void Test()
            {
                var dt = new DataTable();
                dt.Columns.Add(new DataColumn("Id", typeof(long)));
                dt.Columns.Add(new DataColumn("Name", typeof(string)));
                dt.Columns[1].AllowDBNull = true;
                dt.Columns.Add(new DataColumn("Status", typeof(long)));
                dt.Columns.Add(new DataColumn("Guid", typeof(Guid)));
    
                int count = 5;
                for (int i = 0; i < count; ++i)
                {
                    if(i%2 == 0)
                        dt.Rows.Add(i, Guid.NewGuid().ToString(), DBNull.Value, Guid.NewGuid());
                    else
                        dt.Rows.Add(i, DBNull.Value, 1, Guid.NewGuid());
                }
    
                var reader = dt.CreateDataReader();
    
                var items = Mapper.Map<IDataReader, IEnumerable<TestClass>>(reader);
    
                Assert.AreEqual(count, items.Count());
                
                foreach(DataRow row in dt.Rows)
                {
    	            	var o1 = row[0];
    	            	var o2 = row[1];
    	            	var o3 = row[2];
    	            	var o4 = row[3];
                	  
    	            	var i1 = Mapper.Map<object,int>(o1);
    	            	var i2 = Mapper.Map<object,string>(o2);
    	            	var i3 = Mapper.Map<object,int>(o3);
    	            	var i4 = Mapper.Map<object,Guid>(o4);
                }
            }
    

      6. DataTable -> List  (原理是先把DataTable->DataReader->List)

          7. List -> DataTable (略)

          8. ListSource -> List , List -> ListSource (略)

          9. List -> List

           enum MappingFromStatus
            {
                Value1 = 0,
                Value2 = 1
            }
    
            class MappingFrom
            {
                public int FromID { get; set; }
                public string Name;
    
                public int Other;
    
                public MappingFromStatus Status;
    
                public Guid Guid;
            }
    
            struct MappingTo
            {
                public int From_id;
                public string Name { get; set; }
    
                public string Other2;
    
                public int Status;
                public Guid Guid;
            }
    
            [Test]
            public void Test()
            {
                var actual = Mapper.Map<string, int>("12");
                Assert.AreEqual(12, actual);
    
    
                Assert.AreEqual(1, Mapper.Map<int, decimal?>(1));
    
                var actualArray = Mapper.Map<IList<int>, decimal?[]>(new List<int> { 1, 2, 3 });
                Assert.AreEqual(2, actualArray[1]);
    
    
                var longColl = Mapper.Map<int[], List<long>>(new int[] { 1, 2, 3 });
                Assert.AreEqual(2, longColl[1]);
    
                var doubleArray = Mapper.Map<List<string>, double[]>(new List<string> { "1.1", "2.2", "3.3" });
                Assert.AreEqual(2.2, doubleArray[1]);
    
    
                Mapper
                    .CreateMapper<MappingFrom, MappingTo>()
                    .IgnoreCase(true)
                    .IgnoreUnderscore(true)
                   .IgnoreSourceMember(x => x.Guid);
    
                var guid = Guid.NewGuid();
                var customFrom = new MappingFrom { FromID = 1, Name = "name", Status = MappingFromStatus.Value2, Guid = guid };
                var customTo = Mapper.Map<MappingFrom, MappingTo>(customFrom);
                Assert.AreEqual(1, customTo.From_id);
                Assert.AreEqual("name", customTo.Name);
                Assert.IsNullOrEmpty(customTo.Other2);
                Assert.AreEqual(1, customTo.Status);
                Assert.AreNotEqual(guid, customTo.Guid);

      10. Class -> Class

            public class ModelObject
            {
                public DateTime BaseDate { get; set; }
                public ModelSubObject Sub { get; set; }
                public ModelSubObject Sub2 { get; set; }
                public ModelSubObject SubWithExtraName { get; set; }
            }
    
            public class ModelSubObject
            {
                public string ProperName { get; set; }
                public ModelSubSubObject SubSub { get; set; }
            }
    
            public class ModelSubSubObject
            {
                public string IAmACoolProperty { get; set; }
            }
    
            public class ModelDto
            {
                public DateTime BaseDate { get; set; }
                public string SubProperName { get; set; }
                public string Sub2ProperName { get; set; }
                public string SubWithExtraNameProperName { get; set; }
                public string SubSubSubIAmACoolProperty { get; set; }
            }
    
            [Test]
            public void TestFlattering()
            {
                var source = new ModelObject
                {
                    BaseDate = DateTime.Now,
                    Sub = new ModelSubObject
                    {
                        ProperName = "Some name",
                        SubSub = new ModelSubSubObject
                        {
                            IAmACoolProperty = "Cool daddy-o"
                        }
                    },
                    Sub2 = new ModelSubObject
                    {
                        ProperName = "Sub 2 name"
                    },
                    SubWithExtraName = new ModelSubObject
                    {
                        ProperName = "Some other name"
                    },
                };
    
                var b =Mapper.Map<ModelObject, ModelDto>(source);
    
                Assert.AreEqual(source.BaseDate, b.BaseDate);
                Assert.AreEqual(source.Sub.ProperName, b.SubProperName);
                Assert.AreEqual(source.Sub2.ProperName, b.Sub2ProperName);
                Assert.AreEqual(source.SubWithExtraName.ProperName, b.SubWithExtraNameProperName);
                Assert.AreEqual(source.Sub.SubSub.IAmACoolProperty, b.SubSubSubIAmACoolProperty);
            }
    

    完。

  • 相关阅读:
    第15章 RCC—使用HSE/HSI配置时钟—零死角玩转STM32-F429系列
    第14章 启动文件详解—零死角玩转STM32-F429系列
    第13章 GPIO-位带操作—零死角玩转STM32-F429系列
    第12章 GPIO输入-按键检测—零死角玩转STM32-F429系列
    使用Vmware过程中,突然网络连接不上问题
    Yaf自定义autoload以实现Model文件和Controller文件命名区分
    Yaf学习过程中遇到的问题小记
    网页出现横向滚动条的原因可能是使用bootstrap不当引起
    微信小程序开发(一)
    nginx 启动报错找不到nginx.pid文件
  • 原文地址:https://www.cnblogs.com/netcasewqs/p/2009403.html
Copyright © 2020-2023  润新知