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);
}
完。

浙公网安备 33010602011771号