代碼生成我本想利用t4模闆,但是由于我們的項目ide版本是vs2008,對于t4的參數傳遞支援還不是很友好,你可能說用appdomain.setdata,或者callcontext.logicalsetdata,但是可惜我們的餓mappingrule是不可序列化的,是以最後我隻得采用了字元串拼接最笨的辦法,為了應對生成政策不同,在這裡我們加入了政策模式來應付,來看看代碼結構吧:
![](https://img.laitimes.com/img/__Qf2AjLwojIjJCLyojI0JCLicmbw5CNyMDO2MDM1AjMxMzMwITMwIzLcNDMyEDMy8CXmx2b3VGdph2dvwVbvN2Xzd2bsJmbj9CXt92YuM3ZvxmYuNmLzV2Zh1Wavw1LcpDc0RHaiojIsJye.png)
在這裡隻支援對do的二級屬性映射為dto的平面屬性,全部針對imappingrule生成代碼,在這裡為了生成合法的代碼而非表達式,對以前的表達式進行了重新的标準約定,在代碼注釋。以及對上個版本的list轉換進行了多次重載,主要為了滿足dto到do對象的特殊要求,因為我們在領域開發存儲dto的時候都是需要先取出do對象在根據dto在do對象的基礎上進行修改,以便orm領域架構或者uow的跟蹤記錄。
studendo stu = new studendo()
{
id = 1,
name = "test1",
sex = sex.女,
address = new address()
{
country = "中國",
province = "四川",
street = "高新區"
},
courseids = new list<string>() { "1", "2", "3" },
propertys = new list<keyvaluepair>() { new keyvaluepair() { key = "1", value = "1" } },
contactway = new contactway()
phone = "1111111111111111",
email = "xxxx@12f",
qq = "7889789999889"
}
};
func<studendo, studendo, bool> fun = (f, j) => f.id == j.id;
var s = fun.tostring();
var mapper = objectmappermanager.default.getmapper<studendto, studendo>();
mapper.agilemappertemplatestrategy.defaultequalexpression = "{0}.id == {1}.id && {1}.id != 0";
var str1 = mapper.codegenerator();
system.io.file.delete(@"e:\project\opensource\agilemapper\agilemappper.test\codetemplate.test\1.cs");
system.io.file.appendalltext(@"e:\project\opensource\agilemapper\agilemappper.test\codetemplate.test\1.cs", str1);
var mapper1 = objectmappermanager.default.getmapper<contactwaydto, contactway>();
str1 = mapper1.codegenerator();
system.io.file.delete(@"e:\project\opensource\agilemapper\agilemappper.test\codetemplate.test\2.cs");
system.io.file.appendalltext(@"e:\project\opensource\agilemapper\agilemappper.test\codetemplate.test\2.cs", str1);
var mapper2 = objectmappermanager.default.getmapper<keyvaluepairdto, keyvaluepair>();
str1 = mapper2.codegenerator();
system.io.file.delete(@"e:\project\opensource\agilemapper\agilemappper.test\codetemplate.test\3.cs");
system.io.file.appendalltext(@"e:\project\opensource\agilemapper\agilemappper.test\codetemplate.test\3.cs", str1);
最後的生成檔案:
1.cs:
using system;
using system.linq;
using system.data;
using system.collections.generic;
namespace green.agilemapper
{
public static partial class agilemappermapping
{
/// <summary>
/// green.agilemapper.test.studendto warp fromobj green.agilemapper.test.studendo;
/// </summary>
/// <param name="domainobj">green.agilemapper.test.studendo</param>
/// <returns>green.agilemapper.test.studendto</returns>
public static green.agilemapper.test.studendto warp(this green.agilemapper.test.studendo domainobj)
{
var fromobj = new green.agilemapper.test.studendto();
fromobj.id = domainobj.id;
fromobj.name = domainobj.name;
fromobj.sex = domainobj.sex;
if (domainobj.address != null)
{
fromobj.country = domainobj.address.country;
fromobj.province = domainobj.address.province;
}
fromobj.particular = domainobj.address.country + " 國籍 " + domainobj.address.province + " 省 ";
fromobj.firstpropertykey = domainobj.propertys[0].key;
if (domainobj.contactway != null)
fromobj.contactway = domainobj.contactway.warp();
if (domainobj.courseids != null)
fromobj.courseids = new list<system.string>();
foreach (var item_courseids in domainobj.courseids)
{
fromobj.courseids.add(item_courseids);
}
if (domainobj.propertys != null)
fromobj.propertys = domainobj.propertys.warp();
return fromobj;
}
/// green.agilemapper.test.studendto warp domainobj green.agilemapper.test.studendo;
/// <returns>fromobj</returns>
public static void warp(this green.agilemapper.test.studendto fromobj, green.agilemapper.test.studendo domainobj)
if (fromobj == null)
return;
if (domainobj == null)
domainobj = new green.agilemapper.test.studendo();
domainobj.id = fromobj.id;
domainobj.name = fromobj.name;
domainobj.sex = fromobj.sex;
if (domainobj.address == null)
domainobj.address = new green.agilemapper.test.address();
domainobj.address.country = fromobj.country;
domainobj.address.province = fromobj.province;
if (domainobj.contactway == null)
domainobj.contactway = new green.agilemapper.test.contactway();
fromobj.contactway.warp(domainobj.contactway);
if (fromobj.courseids != null)
if (domainobj.courseids == null)
domainobj.courseids = new list<system.string>();
domainobj.courseids.clear();
foreach (var item_courseids in fromobj.courseids)
domainobj.courseids.add(item_courseids);
if (fromobj.propertys != null)
if (domainobj.propertys == null)
domainobj.propertys = new list<green.agilemapper.test.keyvaluepair>();
fromobj.propertys.warp(domainobj.propertys, (fromobjitem, domainobjitem) => fromobjitem.key == domainobjitem.key, true);
/// green.agilemapper.test.studendto collection warp fromobj green.agilemapper.test.studendo collection;
/// <param name="form">green.agilemapper.test.studendto collection</param>
/// <param name="domainobj">green.agilemapper.test.studendo collection</param>
public static list<green.agilemapper.test.studendto> warp(this ilist<green.agilemapper.test.studendo> domainobj)
list<green.agilemapper.test.studendto> froms = new list<green.agilemapper.test.studendto>();
domainobj.tolist().foreach(t =>
froms.add(warp(t));
});
return froms;
/// green.agilemapper.test.studendto collection warp domainobj green.agilemapper.test.studendo collection;
/// <param name="fromobj">green.agilemapper.test.studendto collection</param>
/// <param name="domainobj">green.agilemapper.test.studendo collection</param>
public static void warp(this ilist<green.agilemapper.test.studendto> fromobj, ilist<green.agilemapper.test.studendo> domainobj)
fromobj.warp(domainobj, (fromobjitem, domainobjitem) => fromobjitem.id == domainobjitem.id && domainobjitem.id != 0, false);
/// <param name="domainobj">green.agilemapper.test.studendo collection</param>
/// <param name="isdeletenotinfromitem">delete the item that not in from collection</param>
public static void warp(this ilist<green.agilemapper.test.studendto> fromobj, ilist<green.agilemapper.test.studendo> domainobj, bool isdeletenotinfromitem)
fromobj.warp(domainobj, (fromobjitem, domainobjitem) => fromobjitem.id == domainobjitem.id && domainobjitem.id != 0, isdeletenotinfromitem);
/// <param name="equalpredicate">the from item equal to item expression</param>
public static void warp(this ilist<green.agilemapper.test.studendto> fromobj, ilist<green.agilemapper.test.studendo> domainobj, func<green.agilemapper.test.studendto, green.agilemapper.test.studendo, bool> equalpredicate)
fromobj.warp(domainobj, equalpredicate, false);
/// <param name="domainobj">green.agilemapper.test.studendo collection</param>
/// <param name="equalpredicate">the from item equal to item expression</param>
/// <param name="isdeletenotinfromitem">delete the item that not in from collection</param>
public static void warp(this ilist<green.agilemapper.test.studendto> fromobj, ilist<green.agilemapper.test.studendo> domainobj, func<green.agilemapper.test.studendto, green.agilemapper.test.studendo, bool> equalpredicate, bool isdeletenotinfromitem)
domainobj = new list<green.agilemapper.test.studendo>();
//如果需要删除不存在于 from的list集合,先删除後修改
if (isdeletenotinfromitem)
domainobj.where(domainobjitem => fromobj.firstordefault(fromobjitem => equalpredicate(fromobjitem, domainobjitem)) == null)
.tolist().foreach(t =>
{
domainobj.remove(t);
});
fromobj.tolist().foreach(fromobjitem =>
green.agilemapper.test.studendo toitem = default(green.agilemapper.test.studendo);
if (equalpredicate != null)
toitem = domainobj.singleordefault(domainobjitem => equalpredicate(fromobjitem, domainobjitem));
if (toitem == null)
toitem = new green.agilemapper.test.studendo();
domainobj.add(toitem);
warp(fromobjitem, toitem);
}
}
2.cs
using system;
/// green.agilemapper.test.contactwaydto warp fromobj green.agilemapper.test.contactway;
/// <param name="domainobj">green.agilemapper.test.contactway</param>
/// <returns>green.agilemapper.test.contactwaydto</returns>
public static green.agilemapper.test.contactwaydto warp(this green.agilemapper.test.contactway domainobj)
var fromobj = new green.agilemapper.test.contactwaydto();
fromobj.phone = domainobj.phone;
fromobj.email = domainobj.email;
fromobj.qq = domainobj.qq;
/// green.agilemapper.test.contactwaydto warp domainobj green.agilemapper.test.contactway;
public static void warp(this green.agilemapper.test.contactwaydto fromobj, green.agilemapper.test.contactway domainobj)
domainobj = new green.agilemapper.test.contactway();
domainobj.phone = fromobj.phone;
domainobj.email = fromobj.email;
domainobj.qq = fromobj.qq;
/// green.agilemapper.test.contactwaydto collection warp fromobj green.agilemapper.test.contactway collection;
/// <param name="form">green.agilemapper.test.contactwaydto collection</param>
/// <param name="domainobj">green.agilemapper.test.contactway collection</param>
public static list<green.agilemapper.test.contactwaydto> warp(this ilist<green.agilemapper.test.contactway> domainobj)
list<green.agilemapper.test.contactwaydto> froms = new list<green.agilemapper.test.contactwaydto>();
/// green.agilemapper.test.contactwaydto collection warp domainobj green.agilemapper.test.contactway collection;
/// <param name="fromobj">green.agilemapper.test.contactwaydto collection</param>
/// <param name="domainobj">green.agilemapper.test.contactway collection</param>
public static void warp(this ilist<green.agilemapper.test.contactwaydto> fromobj, ilist<green.agilemapper.test.contactway> domainobj)
fromobj.warp(domainobj, (fromobjitem, domainobjitem) => fromobjitem.equals(domainobjitem), false);
/// <param name="domainobj">green.agilemapper.test.contactway collection</param>
public static void warp(this ilist<green.agilemapper.test.contactwaydto> fromobj, ilist<green.agilemapper.test.contactway> domainobj, bool isdeletenotinfromitem)
fromobj.warp(domainobj, (fromobjitem, domainobjitem) => fromobjitem.equals(domainobjitem), isdeletenotinfromitem);
public static void warp(this ilist<green.agilemapper.test.contactwaydto> fromobj, ilist<green.agilemapper.test.contactway> domainobj, func<green.agilemapper.test.contactwaydto, green.agilemapper.test.contactway, bool> equalpredicate)
/// <param name="domainobj">green.agilemapper.test.contactway collection</param>
public static void warp(this ilist<green.agilemapper.test.contactwaydto> fromobj, ilist<green.agilemapper.test.contactway> domainobj, func<green.agilemapper.test.contactwaydto, green.agilemapper.test.contactway, bool> equalpredicate, bool isdeletenotinfromitem)
domainobj = new list<green.agilemapper.test.contactway>();
green.agilemapper.test.contactway toitem = default(green.agilemapper.test.contactway);
toitem = new green.agilemapper.test.contactway();
3.cs:
/// green.agilemapper.test.keyvaluepairdto warp fromobj green.agilemapper.test.keyvaluepair;
/// <param name="domainobj">green.agilemapper.test.keyvaluepair</param>
/// <returns>green.agilemapper.test.keyvaluepairdto</returns>
public static green.agilemapper.test.keyvaluepairdto warp(this green.agilemapper.test.keyvaluepair domainobj)
var fromobj = new green.agilemapper.test.keyvaluepairdto();
fromobj.key = domainobj.key;
fromobj.value = domainobj.value;
/// green.agilemapper.test.keyvaluepairdto warp domainobj green.agilemapper.test.keyvaluepair;
public static void warp(this green.agilemapper.test.keyvaluepairdto fromobj, green.agilemapper.test.keyvaluepair domainobj)
domainobj = new green.agilemapper.test.keyvaluepair();
domainobj.key = fromobj.key;
domainobj.value = fromobj.value;
/// green.agilemapper.test.keyvaluepairdto collection warp fromobj green.agilemapper.test.keyvaluepair collection;
/// <param name="form">green.agilemapper.test.keyvaluepairdto collection</param>
/// <param name="domainobj">green.agilemapper.test.keyvaluepair collection</param>
public static list<green.agilemapper.test.keyvaluepairdto> warp(this ilist<green.agilemapper.test.keyvaluepair> domainobj)
list<green.agilemapper.test.keyvaluepairdto> froms = new list<green.agilemapper.test.keyvaluepairdto>();
/// green.agilemapper.test.keyvaluepairdto collection warp domainobj green.agilemapper.test.keyvaluepair collection;
/// <param name="fromobj">green.agilemapper.test.keyvaluepairdto collection</param>
/// <param name="domainobj">green.agilemapper.test.keyvaluepair collection</param>
public static void warp(this ilist<green.agilemapper.test.keyvaluepairdto> fromobj, ilist<green.agilemapper.test.keyvaluepair> domainobj)
/// <param name="domainobj">green.agilemapper.test.keyvaluepair collection</param>
public static void warp(this ilist<green.agilemapper.test.keyvaluepairdto> fromobj, ilist<green.agilemapper.test.keyvaluepair> domainobj, bool isdeletenotinfromitem)
public static void warp(this ilist<green.agilemapper.test.keyvaluepairdto> fromobj, ilist<green.agilemapper.test.keyvaluepair> domainobj, func<green.agilemapper.test.keyvaluepairdto, green.agilemapper.test.keyvaluepair, bool> equalpredicate)
/// <param name="domainobj">green.agilemapper.test.keyvaluepair collection</param>
public static void warp(this ilist<green.agilemapper.test.keyvaluepairdto> fromobj, ilist<green.agilemapper.test.keyvaluepair> domainobj, func<green.agilemapper.test.keyvaluepairdto, green.agilemapper.test.keyvaluepair, bool> equalpredicate, bool isdeletenotinfromitem)
domainobj = new list<green.agilemapper.test.keyvaluepair>();
green.agilemapper.test.keyvaluepair toitem = default(green.agilemapper.test.keyvaluepair);
toitem = new green.agilemapper.test.keyvaluepair();