目录
介绍
四年前(2015年),我使用IL代码创建了对象映射器的初始版本。就在几周前,我决定用Expression Tree重新实现HigLabo.Mapper并实现巨大的性能提升。它是目前世界上得分最快的。GitHub存储库是 https://github.com/higty/higlabo您可以在https://github.com/higty/higlabo.netstandard/tree/master/HigLabo.Mapper
看到我的10天提交日志。
目前,我刚刚在.NET6上发布了HigLabo.Mapper。最新版本的HigLabo.Mapper在这里。
https://github.com/higty/higlabo/tree/master/Net6
您可以从支持DateOnly、TimeOnly类型的Nuget中使用。
您可以从Nuget下载。
HigLabo.Mapper(版本6.1.xx)
背景
现在一天,无论你是Web、Desktop、Mobile的开发者,你都可能会用到一些POCO、DTO对象。而且您必须将属性值从一个对象转移到另一个对象。对象映射器对于这种情况很有用。这一次,我重新实现的目标如下:
- 世界上最快的
- 零配置提高生产力
- 针对各种用例的完全自定义
- 应用程序的多个映射规则
如何使用?
您可以从Nuget包中获取HigLabo.Mapper(版本6.1.0.0或更高版本)。
在您的应用程序中添加using指令:
using HigLabo.Core;
现在您可以使用这样的Map扩展方法:
var a1 = new Address(); //your POCO class.
var a2 = a1.Map(new Address());
HigLabo.Mapper支持字典到对象的映射。
var d = new Dictionary<String, String>();
d["Name"] = "Bill";
var person = d.Map(new Person());
//person.Name is "Bill"
对象到字典也支持。
var p = new Person();
p.Name = "Bill";
var d = p.Map(new Dictionary<String, String>);
//d["Name"] is "Bill"
我设计HigLabo.Mapper易于使用。
与其他映射器的比较
在本章中,我将解释与其他映射器库的区别。这是比较总结。
- 性能
- 初始配置
- 自定义
- 多重设置
性能!!!
它对映射器库很重要,因为它倾向于在更深的地方使用,例如内部循环。性能测试的总结在这里。
- 比AutoMapper快3到4倍(对于没有集合属性的POCO)
- 比Mapster快10%-20%(对于没有集合属性的POCO)
- 比AgileMapper、FastMapper、TinyMapper快7-10倍(对于没有集合属性的POCO)
- 比AutoMapper快3倍(对于具有集合属性的POCO)
- 比Mapster快10倍(对于具有集合属性的POCO)
- 比AgileMapper、FastMapper、TinyMapper 快10-20倍(对于具有集合属性的POCO)
这是使用BenchmarkDotNet的性能测试结果。HigLaboObjectMapper_XXXX是 new HigLabo.Mapper的结果。
这是一个用于性能测试的类。
public class Address
{
public int Id { get; set; }
public string Street { get; set; }
public string City { get; set; }
public string Country { get; set; }
public AddressType AddressType { get; set; }
}
public class AddressDTO
{
public int Id { get; set; }
public string City { get; set; }
public string Country { get; set; }
public AddressType AddressType { get; set; } = AddressType.House;
}
public struct GpsPosition
{
public double Latitude { get; private set; }
public double Longitude { get; private set; }
public GpsPosition(double latitude, double longitude)
{
this.Latitude = latitude;
this.Longitude = longitude;
}
}
public class Customer
{
public Int32? Id { get; set; }
public String Name { get; set; }
public Address Address { get; set; }
public Address HomeAddress { get; set; }
public Address[] AddressList { get; set; }
public IEnumerable<Address> WorkAddressList { get; set; }
}
public class CustomerDTO
{
public Int32? Id { get; set; }
public string Name { get; set; }
public Address Address { get; set; }
public AddressDTO HomeAddress { get; set; }
public AddressDTO[] AddressList { get; set; }
public List<AddressDTO> WorkAddressList { get; set; }
public String AddressCity { get; set; }
}
我测试了4种类型的映射,如下所示:
1. POCO class without collection property to same class.
XXX.Map(new Address(), new Address())
2. POCO class without collection property to other class.
XXX.Map(new Address(), new AddressDTO())
3. POCO class that has collection property map to same class.
XXX.Map(new Customer(), new Customer())
4. POCO class that has collection property map to other class.
XXX.Map(new Customer(), new CustomerDTO());
如您所见,所有4种情况HigLabo.Mapper都是最快的。
初始配置
一些Mapper需要像这样的初始配置:
var configuration = new AutoMapper.MapperConfiguration(config => {
config.CreateMap<Building, Building>();
config.CreateMap<TreeNode, TreeNode>();
});
这是AutoMapper配置代码。如果你有成千上万的类要映射,那么创建这个映射配置代码是很无聊的。TinyMapper也需要配置。
TinyMapper.Bind<Park, Park>();
TinyMapper.Bind<Customer, CustomerDTO>();
TinyMapper.Bind<Dictionary<String, String>, Building>();
HigLabo.Mapper不需要任何配置。您可以开箱即用。
自定义
有时,您希望针对您的POCO对象自定义映射规则。AutoMapper自定义映射规则非常复杂。我比较了这个页面AutoMapper和HigLabo.Mapper的例子。
c# - delegating Member mapping to child object with AutoMapper - Stack Overflow
class Source {
public int Id {get;set;}
public int UseThisInt {get;set;}
public InnerType Inner {get;set;}
// other properties that the Destination class is not interested in
}
class InnerType {
public int Id {get;set;}
public int Height {get;set;}
// more inner properties
}
class Destination {
public int Id {get;set;}
public int UseThisInt {get;set;}
public int Height {get;set;}
// more inner properties that should map to InnerType
}
//So many configuration and complicated....
Mapper.Initialize(cfg => {
cfg.CreateMap<source, destination="">();
cfg.CreateMap<innertype, destination="">();
});
var dest = Mapper.Map<destination>(src);
Mapper.Map(src.Inner, dest);
Mapper.Initialize(cfg => {
cfg.CreateMap<source, destination="">()AfterMap
((src, dest) => Mapper.Map(src.Inner, dest));
cfg.CreateMap<innertype, destination="">();
});
var dest = Mapper.Map<destination>(src);
如果你使用AutoMapper,你必须知道像Mapper.Initialize, ForMember , CreateMap, AfterMap等这样的AutoMapper库。
HigLabo.Mapper可以这样自定义:
c.AddPostAction<Source, Destination>((s, d) =>
{
d.Id = s.Inner.Id;
//Set Inner object property to Destination object
s.Inner.Map(d);
});
当您调用Map方法时,HigLabo.Mapper只需在映射完成后调用此lambda。因此,您可以覆盖默认映射规则。
您可以使用以下ReplaceMap方法完全替换映射规则:
c.ReplaceMap<Source, Destination>((s, d) =>
{
//Set all map with your own.
d.Id = s.Inner.Id;
//Set Inner object property to Destination object
s.Inner.Map(d);
});
//You can call Map method.
var source = new Source();
var destination = new Destination();
source.Map(distination); //Above lambda will be called.
它很简单,不需要额外的知识。您只能了解您已经使用的C# lambda。
您可以轻松添加转换逻辑。
c.AddPostAction<Person, PersonVM>((s, d) =>
{
d.BMI = CalculateBMI(s.Height, s.Weight);
});
您还可以使用条件属性映射。
c.AddPostAction<Employee, EmployeeVM>((s, d) =>
{
if (s.EmployeeType == EmployeeType.Contract)
{
d.Property1 = someValue1;
}
else
{
d.Property1 = someValue2;
}
});
这种设计的另一个优点是您可以轻松调试代码。您可以在lambda内部的AddPostAction、ReplaceMap方法上设置断点。
您还可以像这样自定义属性映射规则:
class Person
{
public string Name { get; set; }
public string Position_Name { get; set; }
}
class PersonModel
{
public string Name { get; set; }
public string PositionName { get; set; }
}
var mapper = HigLabo.Core.ObjectMapper.Default;
mapper.CompilerConfig.PropertyMatchRule =
(sourceType, sourceProperty, targetType, targetProperty)
{
if (sourceType == typeof(Person) && targetType == typeof(PersonModel))
{
return sourceProperty.Name.Replace("_", "") == targetProperty.Name;
}
return false;
};
多重设置
您可以创建多个ObjectMapper类实例。
var om1 = new ObjectMapper();
om1.AddPostAction<Address, Address>((s, d) =>
{
//Custom map rule
});
var om2 = new ObjectMapper();
om2.AddPostAction<Address, Address>((s, d) =>
{
//Another Custom map rule
});
var a = new Address();
var a1 = om1.Map(a, new Address());
var a2 = om1.Map(a, new Address());
映射扩展方法被声明为ObjectMapperExtensions类。该方法只是调用ObjectMapper.Default实例的方法。
using System;
namespace HigLabo.Core
{
public static class ObjectMapperExtensions
{
public static TTarget Map<TSource, TTarget>(this TSource source, TTarget target)
{
return ObjectMapper.Default.Map(source, target);
}
public static TTarget MapOrNull<TSource, TTarget>
(this TSource source, Func<TTarget> targetConstructor)
where TTarget : class
{
return ObjectMapper.Default.MapOrNull(source, targetConstructor);
}
public static TTarget MapOrNull<TSource, TTarget>(this TSource source, TTarget target)
where TTarget : class
{
return ObjectMapper.Default.MapOrNull(source, target);
}
public static TTarget MapFrom<TTarget, TSource>(this TTarget target, TSource source)
{
return ObjectMapper.Default.Map(source, target);
}
}
}
因此,您可以创建一个新实例并添加新规则并使用它。
您可以像这样封装初始化代码:
public static class ObjectMapperExtensions
{
public static void Initialize(this ObjectMapper mapper)
{
mapper.AddPostAction<Address, Address>((s, d) =>
{
//Your mapping rule.
});
mapper.AddPostAction<Address, Address>((s, d) =>
{
//Another your mapping rule.
});
}
}
//And call it on Application initialization process.
ObjectMapper.Default.Initialize();
映射测试用例
我在这里创建了所有测试用例:
我测试了以前版本支持的所有情况,除了字典自定义映射的1种情况。
但我认为可能会包含一些罕见的情况,即casse异常,因为这是初始版本。如果您遇到异常,请随时在GitHub issue上向我提问。
深入研究生成的表达式树
测试用例在这里。
https://github.com/higty/higlabo/tree/master/NetStandard/HigLabo.Test/HigLabo.Mapper.Test
ObjectMapper_Map_ValueType_ValueType测试用例将使用表达式树生成以下代码。
.Lambda #Lambda1<System.Func`3[System.Object,System.Object,HigLabo.Mapper.Test.Vector2]>(
System.Object $sourceParameter,
System.Object $targetParameter) {
.Block(
HigLabo.Mapper.Test.Vector2 $source,
HigLabo.Mapper.Test.Vector2 $target) {
$source = .Unbox($sourceParameter);
$target = .Unbox($targetParameter);
.Call $target.set_X($source.X);
.Call $target.set_Y($source.Y);
$target
}
}
Address到AddressDTO 将生成此表达式树为MapAction Func。
.Lambda #Lambda1<System.Func`3[System.Object,System.Object,HigLabo.Mapper.PerformanceTest.AddressDTO]>(
System.Object $sourceParameter,
System.Object $targetParameter) {
.Block(
HigLabo.Mapper.PerformanceTest.Address $source,
HigLabo.Mapper.PerformanceTest.AddressDTO $target) {
$source = $sourceParameter .As HigLabo.Mapper.PerformanceTest.Address;
$target = $targetParameter .As HigLabo.Mapper.PerformanceTest.AddressDTO;
.Call $target.set_Id($source.Id);
.Call $target.set_City($source.City);
.Call $target.set_Country($source.Country);
.Call $target.set_AddressType($source.AddressType);
$target
}
}
ObjectMapper_Map_CollectionElementCreateMode_CollectionElementCreateMode_NewObject将生成以下代码:
.Lambda #Lambda1<System.Func`3[System.Object,System.Object,HigLabo.Mapper.Test.User]>(
System.Object $sourceParameter,
System.Object $targetParameter) {
.Block(
HigLabo.Mapper.Test.User $source,
HigLabo.Mapper.Test.User $target) {
$source = $sourceParameter .As HigLabo.Mapper.Test.User;
$target = $targetParameter .As HigLabo.Mapper.Test.User;
.Call $target.set_Value($source.Value);
.Call $target.set_Name($source.Name);
.Call $target.set_Int32($source.Int32);
.Call $target.set_Int32Nullable($source.Int32Nullable);
.Call $target.set_Int32_Nullable($source.Int32_Nullable);
.Call $target.set_Int32NullableToInt32($source.Int32NullableToInt32);
.Call $target.set_DateTime($source.DateTime);
.Call $target.set_DateTimeNullable($source.DateTimeNullable);
.Call $target.set_Decimal($source.Decimal);
.Call $target.set_DecimalNullable($source.DecimalNullable);
.Call $target.set_DayOfWeek($source.DayOfWeek);
.Call $target.set_DayOfWeekNullable($source.DayOfWeekNullable);
.Call $target.set_Guid($source.Guid);
.Call $target.set_GuidNullable($source.GuidNullable);
.If ($source.MapPoint == null) {
.Call $target.set_MapPoint(.Default(HigLabo.Mapper.Test.MapPoint))
} .Else {
.Block() {
.If ($target.MapPoint == null) {
$target.MapPoint = .New HigLabo.Mapper.Test.MapPoint()
} .Else {
.Default(System.Void)
};
.Call ($target.MapPoint).set_Longitude(($source.MapPoint).Longitude);
.Call ($target.MapPoint).set_Latitude(($source.MapPoint).Latitude)
}
};
.Call $target.set_VectorToNullable($source.VectorToNullable);
.Call $target.set_Vector2($source.Vector2);
.If ($source.ParentUser == null) {
.Call $target.set_ParentUser(.Default(HigLabo.Mapper.Test.User))
} .Else {
.Block() {
.If ($target.ParentUser == null) {
$target.ParentUser = .New HigLabo.Mapper.Test.User()
} .Else {
.Default(System.Void)
};
.Call ($target.ParentUser).set_Value(($source.ParentUser).Value);
.Call ($target.ParentUser).set_Name(($source.ParentUser).Name);
.Call ($target.ParentUser).set_Int32(($source.ParentUser).Int32);
.Call ($target.ParentUser).set_Int32Nullable(($source.ParentUser).Int32Nullable);
.Call ($target.ParentUser).set_Int32_Nullable(($source.ParentUser).Int32_Nullable);
.Call ($target.ParentUser).set_Int32NullableToInt32(($source.ParentUser).Int32NullableToInt32);
.Call ($target.ParentUser).set_DateTime(($source.ParentUser).DateTime);
.Call ($target.ParentUser).set_DateTimeNullable(($source.ParentUser).DateTimeNullable);
.Call ($target.ParentUser).set_Decimal(($source.ParentUser).Decimal);
.Call ($target.ParentUser).set_DecimalNullable(($source.ParentUser).DecimalNullable);
.Call ($target.ParentUser).set_DayOfWeek(($source.ParentUser).DayOfWeek);
.Call ($target.ParentUser).set_DayOfWeekNullable(($source.ParentUser).DayOfWeekNullable);
.Call ($target.ParentUser).set_Guid(($source.ParentUser).Guid);
.Call ($target.ParentUser).set_GuidNullable(($source.ParentUser).GuidNullable);
.If (($source.ParentUser).MapPoint == null) {
.Call ($target.ParentUser).set_MapPoint(.Default(HigLabo.Mapper.Test.MapPoint))
} .Else {
.Block() {
.If (($target.ParentUser).MapPoint == null) {
($target.ParentUser).MapPoint = .New HigLabo.Mapper.Test.MapPoint()
} .Else {
.Default(System.Void)
};
.Call (($target.ParentUser).MapPoint).set_Longitude((($source.ParentUser).MapPoint).Longitude);
.Call (($target.ParentUser).MapPoint).set_Latitude((($source.ParentUser).MapPoint).Latitude)
}
};
.Call ($target.ParentUser).set_VectorToNullable(($source.ParentUser).VectorToNullable);
.Call ($target.ParentUser).set_Vector2(($source.ParentUser).Vector2);
.If (($source.ParentUser).ParentUser == null) {
.Call ($target.ParentUser).set_ParentUser(.Default(HigLabo.Mapper.Test.User))
} .Else {
.Block() {
.If (($target.ParentUser).ParentUser == null) {
($target.ParentUser).ParentUser = .New HigLabo.Mapper.Test.User()
} .Else {
.Default(System.Void)
};
.Call (($target.ParentUser).ParentUser).set_Value((($source.ParentUser).ParentUser).Value);
.Call (($target.ParentUser).ParentUser).set_Name((($source.ParentUser).ParentUser).Name);
.Call (($target.ParentUser).ParentUser).set_Int32((($source.ParentUser).ParentUser).Int32);
.Call (($target.ParentUser).ParentUser).set_Int32Nullable((($source.ParentUser).ParentUser).Int32Nullable);
.Call (($target.ParentUser).ParentUser).set_Int32_Nullable((($source.ParentUser).ParentUser).Int32_Nullable);
.Call (($target.ParentUser).ParentUser).set_Int32NullableToInt32((($source.ParentUser).ParentUser).Int32NullableToInt32);
.Call (($target.ParentUser).ParentUser).set_DateTime((($source.ParentUser).ParentUser).DateTime);
.Call (($target.ParentUser).ParentUser).set_DateTimeNullable((($source.ParentUser).ParentUser).DateTimeNullable);
.Call (($target.ParentUser).ParentUser).set_Decimal((($source.ParentUser).ParentUser).Decimal);
.Call (($target.ParentUser).ParentUser).set_DecimalNullable((($source.ParentUser).ParentUser).DecimalNullable);
.Call (($target.ParentUser).ParentUser).set_DayOfWeek((($source.ParentUser).ParentUser).DayOfWeek);
.Call (($target.ParentUser).ParentUser).set_DayOfWeekNullable((($source.ParentUser).ParentUser).DayOfWeekNullable);
.Call (($target.ParentUser).ParentUser).set_Guid((($source.ParentUser).ParentUser).Guid);
.Call (($target.ParentUser).ParentUser).set_GuidNullable((($source.ParentUser).ParentUser).GuidNullable);
.If ((($source.ParentUser).ParentUser).MapPoint == null) {
.Call (($target.ParentUser).ParentUser).set_MapPoint(.Default(HigLabo.Mapper.Test.MapPoint))
} .Else {
.Block() {
.If ((($target.ParentUser).ParentUser).MapPoint == null) {
(($target.ParentUser).ParentUser).MapPoint = .New HigLabo.Mapper.Test.MapPoint()
} .Else {
.Default(System.Void)
};
.Call ((($target.ParentUser).ParentUser).MapPoint).set_Longitude(((($source.ParentUser).ParentUser).MapPoint).Longitude);
.Call ((($target.ParentUser).ParentUser).MapPoint).set_Latitude(((($source.ParentUser).ParentUser).MapPoint).Latitude)
}
};
.Call (($target.ParentUser).ParentUser).set_VectorToNullable((($source.ParentUser).ParentUser).VectorToNullable);
.Call (($target.ParentUser).ParentUser).set_Vector2((($source.ParentUser).ParentUser).Vector2);
.If ((($source.ParentUser).ParentUser).ParentUser == null) {
.Call (($target.ParentUser).ParentUser).set_ParentUser(.Default(HigLabo.Mapper.Test.User))
} .Else {
.Block() {
.If ((($target.ParentUser).ParentUser).ParentUser == null) {
(($target.ParentUser).ParentUser).ParentUser = .New HigLabo.Mapper.Test.User()
} .Else {
.Default(System.Void)
};
.Call ((($target.ParentUser).ParentUser).ParentUser).set_Value(((($source.ParentUser).ParentUser).ParentUser).Value);
.Call ((($target.ParentUser).ParentUser).ParentUser).set_Name(((($source.ParentUser).ParentUser).ParentUser).Name);
.Call ((($target.ParentUser).ParentUser).ParentUser).set_Int32(((($source.ParentUser).ParentUser).ParentUser).Int32);
.Call ((($target.ParentUser).ParentUser).ParentUser).set_Int32Nullable(((($source.ParentUser).ParentUser).ParentUser).Int32Nullable);
.Call ((($target.ParentUser).ParentUser).ParentUser).set_Int32_Nullable(((($source.ParentUser).ParentUser).ParentUser).Int32_Nullable);
.Call ((($target.ParentUser).ParentUser).ParentUser).set_Int32NullableToInt32(((($source.ParentUser).ParentUser).ParentUser).Int32NullableToInt32);
.Call ((($target.ParentUser).ParentUser).ParentUser).set_DateTime(((($source.ParentUser).ParentUser).ParentUser).DateTime);
.Call ((($target.ParentUser).ParentUser).ParentUser).set_DateTimeNullable(((($source.ParentUser).ParentUser).ParentUser).DateTimeNullable);
.Call ((($target.ParentUser).ParentUser).ParentUser).set_Decimal(((($source.ParentUser).ParentUser).ParentUser).Decimal);
.Call ((($target.ParentUser).ParentUser).ParentUser).set_DecimalNullable(((($source.ParentUser).ParentUser).ParentUser).DecimalNullable);
.Call ((($target.ParentUser).ParentUser).ParentUser).set_DayOfWeek(((($source.ParentUser).ParentUser).ParentUser).DayOfWeek);
.Call ((($target.ParentUser).ParentUser).ParentUser).set_DayOfWeekNullable(((($source.ParentUser).ParentUser).ParentUser).DayOfWeekNullable);
.Call ((($target.ParentUser).ParentUser).ParentUser).set_Guid(((($source.ParentUser).ParentUser).ParentUser).Guid);
.Call ((($target.ParentUser).ParentUser).ParentUser).set_GuidNullable(((($source.ParentUser).ParentUser).ParentUser).GuidNullable);
.If (((($source.ParentUser).ParentUser).ParentUser).MapPoint == null) {
.Call ((($target.ParentUser).ParentUser).ParentUser).set_MapPoint(.Default(HigLabo.Mapper.Test.MapPoint))
} .Else {
.Block() {
.If (((($target.ParentUser).ParentUser).ParentUser).MapPoint == null) {
((($target.ParentUser).ParentUser).ParentUser).MapPoint = .New HigLabo.Mapper.Test.MapPoint()
} .Else {
.Default(System.Void)
};
.Call (((($target.ParentUser).ParentUser).ParentUser).MapPoint).set_Longitude((((($source.ParentUser).ParentUser).ParentUser).MapPoint).Longitude)
;
.Call (((($target.ParentUser).ParentUser).ParentUser).MapPoint).set_Latitude((((($source.ParentUser).ParentUser).ParentUser).MapPoint).Latitude)
}
};
.Call ((($target.ParentUser).ParentUser).ParentUser).set_VectorToNullable(((($source.ParentUser).ParentUser).ParentUser).VectorToNullable);
.Call ((($target.ParentUser).ParentUser).ParentUser).set_Vector2(((($source.ParentUser).ParentUser).ParentUser).Vector2);
.If (((($source.ParentUser).ParentUser).ParentUser).ParentUser == null) {
.Call ((($target.ParentUser).ParentUser).ParentUser).set_ParentUser(.Default(HigLabo.Mapper.Test.User))
} .Else {
.Block() {
.If (((($target.ParentUser).ParentUser).ParentUser).ParentUser == null) {
((($target.ParentUser).ParentUser).ParentUser).ParentUser = .New HigLabo.Mapper.Test.User()
} .Else {
.Default(System.Void)
};
.Call (((($target.ParentUser).ParentUser).ParentUser).ParentUser).set_Value((((($source.ParentUser).ParentUser).ParentUser).ParentUser).Value);
.Call (((($target.ParentUser).ParentUser).ParentUser).ParentUser).set_Name((((($source.ParentUser).ParentUser).ParentUser).ParentUser).Name);
.Call (((($target.ParentUser).ParentUser).ParentUser).ParentUser).set_Int32((((($source.ParentUser).ParentUser).ParentUser).ParentUser).Int32);
.Call (((($target.ParentUser).ParentUser).ParentUser).ParentUser).set_Int32Nullable((((($source.ParentUser).ParentUser).ParentUser).ParentUser).Int32Nullable);
.Call (((($target.ParentUser).ParentUser).ParentUser).ParentUser).set_Int32_Nullable((((($source.ParentUser).ParentUser).ParentUser).ParentUser).Int32_Nullable);
.Call (((($target.ParentUser).ParentUser).ParentUser).ParentUser).set_Int32NullableToInt32((((($source.ParentUser).ParentUser).ParentUser).ParentUser).Int32NullableToInt32);
.Call (((($target.ParentUser).ParentUser).ParentUser).ParentUser).set_DateTime((((($source.ParentUser).ParentUser).ParentUser).ParentUser).DateTime);
.Call (((($target.ParentUser).ParentUser).ParentUser).ParentUser).set_DateTimeNullable((((($source.ParentUser).ParentUser).ParentUser).ParentUser).DateTimeNullable);
.Call (((($target.ParentUser).ParentUser).ParentUser).ParentUser).set_Decimal((((($source.ParentUser).ParentUser).ParentUser).ParentUser).Decimal);
.Call (((($target.ParentUser).ParentUser).ParentUser).ParentUser).set_DecimalNullable((((($source.ParentUser).ParentUser).ParentUser).ParentUser).DecimalNullable);
.Call (((($target.ParentUser).ParentUser).ParentUser).ParentUser).set_DayOfWeek((((($source.ParentUser).ParentUser).ParentUser).ParentUser).DayOfWeek);
.Call (((($target.ParentUser).ParentUser).ParentUser).ParentUser).set_DayOfWeekNullable((((($source.ParentUser).ParentUser).ParentUser).ParentUser).DayOfWeekNullable);
.Call (((($target.ParentUser).ParentUser).ParentUser).ParentUser).set_Guid((((($source.ParentUser).ParentUser).ParentUser).ParentUser).Guid);
.Call (((($target.ParentUser).ParentUser).ParentUser).ParentUser).set_GuidNullable((((($source.ParentUser).ParentUser).ParentUser).ParentUser).GuidNullable);
.If ((((($source.ParentUser).ParentUser).ParentUser).ParentUser).MapPoint == null) {
.Call (((($target.ParentUser).ParentUser).ParentUser).ParentUser).set_MapPoint(.Default(HigLabo.Mapper.Test.MapPoint))
} .Else {
.Block() {
.If ((((($target.ParentUser).ParentUser).ParentUser).ParentUser).MapPoint == null) {
(((($target.ParentUser).ParentUser).ParentUser).ParentUser).MapPoint = .New HigLabo.Mapper.Test.MapPoint()
} .Else {
.Default(System.Void)
}
}
};
.Call (((($target.ParentUser).ParentUser).ParentUser).ParentUser).set_VectorToNullable((((($source.ParentUser).ParentUser).ParentUser).ParentUser).VectorToNullable)
;
.Call (((($target.ParentUser).ParentUser).ParentUser).ParentUser).set_Vector2((((($source.ParentUser).ParentUser).ParentUser).ParentUser).Vector2)
;
.If ((((($source.ParentUser).ParentUser).ParentUser).ParentUser).ParentUser == null) {
.Call (((($target.ParentUser).ParentUser).ParentUser).ParentUser).set_ParentUser(.Default(HigLabo.Mapper.Test.User))
} .Else {
.Block() {
.If ((((($target.ParentUser).ParentUser).ParentUser).ParentUser).ParentUser == null) {
(((($target.ParentUser).ParentUser).ParentUser).ParentUser).ParentUser = .New HigLabo.Mapper.Test.User()
} .Else {
.Default(System.Void)
}
}
};
.If ((((($source.ParentUser).ParentUser).ParentUser).ParentUser).Dictionary == null) {
.Call (((($target.ParentUser).ParentUser).ParentUser).ParentUser).set_Dictionary(.Default(System.Collections.Generic.Dictionary`2[System.String,System.String]))
} .Else {
.Block() {
.If ((((($target.ParentUser).ParentUser).ParentUser).ParentUser).Dictionary == null) {
(((($target.ParentUser).ParentUser).ParentUser).ParentUser).Dictionary = .New System.Collections.Generic.Dictionary`2[System.String,System.String]()
} .Else {
.Default(System.Void)
}
}
}
}
};
.If (((($source.ParentUser).ParentUser).ParentUser).Dictionary == null) {
.Call ((($target.ParentUser).ParentUser).ParentUser).set_Dictionary(.Default(System.Collections.Generic.Dictionary`2[System.String,System.String]))
} .Else {
.Block() {
.If (((($target.ParentUser).ParentUser).ParentUser).Dictionary == null) {
((($target.ParentUser).ParentUser).ParentUser).Dictionary = .New System.Collections.Generic.Dictionary`2[System.String,System.String]()
} .Else {
.Default(System.Void)
}
}
}
}
};
.If ((($source.ParentUser).ParentUser).Dictionary == null) {
.Call (($target.ParentUser).ParentUser).set_Dictionary(.Default(System.Collections.Generic.Dictionary`2[System.String,System.String]))
} .Else {
.Block() {
.If ((($target.ParentUser).ParentUser).Dictionary == null) {
(($target.ParentUser).ParentUser).Dictionary = .New System.Collections.Generic.Dictionary`2[System.String,System.String]()
} .Else {
.Default(System.Void)
}
}
}
}
};
.If (($source.ParentUser).Dictionary == null) {
.Call ($target.ParentUser).set_Dictionary(.Default(System.Collections.Generic.Dictionary`2[System.String,System.String]))
} .Else {
.Block() {
.If (($target.ParentUser).Dictionary == null) {
($target.ParentUser).Dictionary = .New System.Collections.Generic.Dictionary`2[System.String,System.String]()
} .Else {
.Default(System.Void)
}
}
}
}
};
.If ($source.Dictionary == null) {
.Call $target.set_Dictionary(.Default(System.Collections.Generic.Dictionary`2[System.String,System.String]))
} .Else {
.Block() {
.If ($target.Dictionary == null) {
$target.Dictionary = .New System.Collections.Generic.Dictionary`2[System.String,System.String]()
} .Else {
.Default(System.Void)
}
}
};
.If ($target.Users == null) {
.Call $target.set_Users(.New System.Collections.Generic.List`1[HigLabo.Mapper.Test.User]())
} .Else {
.Default(System.Void)
};
.Block(
HigLabo.Mapper.Test.User $sourceElement,
HigLabo.Mapper.Test.User $targetElement,
System.Int32 $i) {
$i;
.If ($source.Users == null) {
.Return end { }
} .Else {
.Default(System.Void)
};
$i = 0;
.Loop {
.Block() {
.If (($source.Users).Count <= $i) {
.Break endLoop { }
} .Else {
.Default(System.Void)
};
$sourceElement = ($source.Users).Item[$i];
$targetElement = .New HigLabo.Mapper.Test.User();
.Call $targetElement.set_Value($sourceElement.Value);
.Call $targetElement.set_Name($sourceElement.Name);
.Call $targetElement.set_Int32($sourceElement.Int32);
.Call $targetElement.set_Int32Nullable($sourceElement.Int32Nullable);
.Call $targetElement.set_Int32_Nullable($sourceElement.Int32_Nullable);
.Call $targetElement.set_Int32NullableToInt32($sourceElement.Int32NullableToInt32);
.Call $targetElement.set_DateTime($sourceElement.DateTime);
.Call $targetElement.set_DateTimeNullable($sourceElement.DateTimeNullable);
.Call $targetElement.set_Decimal($sourceElement.Decimal);
.Call $targetElement.set_DecimalNullable($sourceElement.DecimalNullable);
.Call $targetElement.set_DayOfWeek($sourceElement.DayOfWeek);
.Call $targetElement.set_DayOfWeekNullable($sourceElement.DayOfWeekNullable);
.Call $targetElement.set_Guid($sourceElement.Guid);
.Call $targetElement.set_GuidNullable($sourceElement.GuidNullable);
.If ($sourceElement.MapPoint == null) {
.Call $targetElement.set_MapPoint(.Default(HigLabo.Mapper.Test.MapPoint))
} .Else {
.Block() {
.If ($targetElement.MapPoint == null) {
$targetElement.MapPoint = .New HigLabo.Mapper.Test.MapPoint()
} .Else {
.Default(System.Void)
};
.Call ($targetElement.MapPoint).set_Longitude(($sourceElement.MapPoint).Longitude);
.Call ($targetElement.MapPoint).set_Latitude(($sourceElement.MapPoint).Latitude)
}
};
.Call $targetElement.set_VectorToNullable($sourceElement.VectorToNullable);
.Call $targetElement.set_Vector2($sourceElement.Vector2);
.If ($sourceElement.ParentUser == null) {
.Call $targetElement.set_ParentUser(.Default(HigLabo.Mapper.Test.User))
} .Else {
.Block() {
.If ($targetElement.ParentUser == null) {
$targetElement.ParentUser = .New HigLabo.Mapper.Test.User()
} .Else {
.Default(System.Void)
};
.Call ($targetElement.ParentUser).set_Value(($sourceElement.ParentUser).Value);
.Call ($targetElement.ParentUser).set_Name(($sourceElement.ParentUser).Name);
.Call ($targetElement.ParentUser).set_Int32(($sourceElement.ParentUser).Int32);
.Call ($targetElement.ParentUser).set_Int32Nullable(($sourceElement.ParentUser).Int32Nullable);
.Call ($targetElement.ParentUser).set_Int32_Nullable(($sourceElement.ParentUser).Int32_Nullable);
.Call ($targetElement.ParentUser).set_Int32NullableToInt32(($sourceElement.ParentUser).Int32NullableToInt32);
.Call ($targetElement.ParentUser).set_DateTime(($sourceElement.ParentUser).DateTime);
.Call ($targetElement.ParentUser).set_DateTimeNullable(($sourceElement.ParentUser).DateTimeNullable);
.Call ($targetElement.ParentUser).set_Decimal(($sourceElement.ParentUser).Decimal);
.Call ($targetElement.ParentUser).set_DecimalNullable(($sourceElement.ParentUser).DecimalNullable);
.Call ($targetElement.ParentUser).set_DayOfWeek(($sourceElement.ParentUser).DayOfWeek);
.Call ($targetElement.ParentUser).set_DayOfWeekNullable(($sourceElement.ParentUser).DayOfWeekNullable);
.Call ($targetElement.ParentUser).set_Guid(($sourceElement.ParentUser).Guid);
.Call ($targetElement.ParentUser).set_GuidNullable(($sourceElement.ParentUser).GuidNullable);
.If (($sourceElement.ParentUser).MapPoint == null) {
.Call ($targetElement.ParentUser).set_MapPoint(.Default(HigLabo.Mapper.Test.MapPoint))
} .Else {
.Block() {
.If (($targetElement.ParentUser).MapPoint == null) {
($targetElement.ParentUser).MapPoint = .New HigLabo.Mapper.Test.MapPoint()
} .Else {
.Default(System.Void)
};
.Call (($targetElement.ParentUser).MapPoint).set_Longitude((($sourceElement.ParentUser).MapPoint).Longitude);
.Call (($targetElement.ParentUser).MapPoint).set_Latitude((($sourceElement.ParentUser).MapPoint).Latitude)
}
};
.Call ($targetElement.ParentUser).set_VectorToNullable(($sourceElement.ParentUser).VectorToNullable);
.Call ($targetElement.ParentUser).set_Vector2(($sourceElement.ParentUser).Vector2);
.If (($sourceElement.ParentUser).ParentUser == null) {
.Call ($targetElement.ParentUser).set_ParentUser(.Default(HigLabo.Mapper.Test.User))
} .Else {
.Block() {
.If (($targetElement.ParentUser).ParentUser == null) {
($targetElement.ParentUser).ParentUser = .New HigLabo.Mapper.Test.User()
} .Else {
.Default(System.Void)
};
.Call (($targetElement.ParentUser).ParentUser).set_Value((($sourceElement.ParentUser).ParentUser).Value);
.Call (($targetElement.ParentUser).ParentUser).set_Name((($sourceElement.ParentUser).ParentUser).Name);
.Call (($targetElement.ParentUser).ParentUser).set_Int32((($sourceElement.ParentUser).ParentUser).Int32);
.Call (($targetElement.ParentUser).ParentUser).set_Int32Nullable((($sourceElement.ParentUser).ParentUser).Int32Nullable);
.Call (($targetElement.ParentUser).ParentUser).set_Int32_Nullable((($sourceElement.ParentUser).ParentUser).Int32_Nullable);
.Call (($targetElement.ParentUser).ParentUser).set_Int32NullableToInt32((($sourceElement.ParentUser).ParentUser).Int32NullableToInt32);
.Call (($targetElement.ParentUser).ParentUser).set_DateTime((($sourceElement.ParentUser).ParentUser).DateTime);
.Call (($targetElement.ParentUser).ParentUser).set_DateTimeNullable((($sourceElement.ParentUser).ParentUser).DateTimeNullable);
.Call (($targetElement.ParentUser).ParentUser).set_Decimal((($sourceElement.ParentUser).ParentUser).Decimal);
.Call (($targetElement.ParentUser).ParentUser).set_DecimalNullable((($sourceElement.ParentUser).ParentUser).DecimalNullable);
.Call (($targetElement.ParentUser).ParentUser).set_DayOfWeek((($sourceElement.ParentUser).ParentUser).DayOfWeek);
.Call (($targetElement.ParentUser).ParentUser).set_DayOfWeekNullable((($sourceElement.ParentUser).ParentUser).DayOfWeekNullable);
.Call (($targetElement.ParentUser).ParentUser).set_Guid((($sourceElement.ParentUser).ParentUser).Guid);
.Call (($targetElement.ParentUser).ParentUser).set_GuidNullable((($sourceElement.ParentUser).ParentUser).GuidNullable);
.If ((($sourceElement.ParentUser).ParentUser).MapPoint == null) {
.Call (($targetElement.ParentUser).ParentUser).set_MapPoint(.Default(HigLabo.Mapper.Test.MapPoint))
} .Else {
.Block() {
.If ((($targetElement.ParentUser).ParentUser).MapPoint == null) {
(($targetElement.ParentUser).ParentUser).MapPoint = .New HigLabo.Mapper.Test.MapPoint()
} .Else {
.Default(System.Void)
};
.Call ((($targetElement.ParentUser).ParentUser).MapPoint).set_Longitude(((($sourceElement.ParentUser).ParentUser).MapPoint).Longitude);
.Call ((($targetElement.ParentUser).ParentUser).MapPoint).set_Latitude(((($sourceElement.ParentUser).ParentUser).MapPoint).Latitude)
}
};
.Call (($targetElement.ParentUser).ParentUser).set_VectorToNullable((($sourceElement.ParentUser).ParentUser).VectorToNullable);
.Call (($targetElement.ParentUser).ParentUser).set_Vector2((($sourceElement.ParentUser).ParentUser).Vector2);
.If ((($sourceElement.ParentUser).ParentUser).ParentUser == null) {
.Call (($targetElement.ParentUser).ParentUser).set_ParentUser(.Default(HigLabo.Mapper.Test.User))
} .Else {
.Block() {
.If ((($targetElement.ParentUser).ParentUser).ParentUser == null) {
(($targetElement.ParentUser).ParentUser).ParentUser = .New HigLabo.Mapper.Test.User()
} .Else {
.Default(System.Void)
};
.Call ((($targetElement.ParentUser).ParentUser).ParentUser).set_Value(((($sourceElement.ParentUser).ParentUser).ParentUser).Value);
.Call ((($targetElement.ParentUser).ParentUser).ParentUser).set_Name(((($sourceElement.ParentUser).ParentUser).ParentUser).Name);
.Call ((($targetElement.ParentUser).ParentUser).ParentUser).set_Int32(((($sourceElement.ParentUser).ParentUser).ParentUser).Int32);
.Call ((($targetElement.ParentUser).ParentUser).ParentUser).set_Int32Nullable(((($sourceElement.ParentUser).ParentUser).ParentUser).Int32Nullable);
.Call ((($targetElement.ParentUser).ParentUser).ParentUser).set_Int32_Nullable(((($sourceElement.ParentUser).ParentUser).ParentUser).Int32_Nullable);
.Call ((($targetElement.ParentUser).ParentUser).ParentUser).set_Int32NullableToInt32(((($sourceElement.ParentUser).ParentUser).ParentUser).Int32NullableToInt32);
.Call ((($targetElement.ParentUser).ParentUser).ParentUser).set_DateTime(((($sourceElement.ParentUser).ParentUser).ParentUser).DateTime);
.Call ((($targetElement.ParentUser).ParentUser).ParentUser).set_DateTimeNullable(((($sourceElement.ParentUser).ParentUser).ParentUser).DateTimeNullable);
.Call ((($targetElement.ParentUser).ParentUser).ParentUser).set_Decimal(((($sourceElement.ParentUser).ParentUser).ParentUser).Decimal);
.Call ((($targetElement.ParentUser).ParentUser).ParentUser).set_DecimalNullable(((($sourceElement.ParentUser).ParentUser).ParentUser).DecimalNullable);
.Call ((($targetElement.ParentUser).ParentUser).ParentUser).set_DayOfWeek(((($sourceElement.ParentUser).ParentUser).ParentUser).DayOfWeek);
.Call ((($targetElement.ParentUser).ParentUser).ParentUser).set_DayOfWeekNullable(((($sourceElement.ParentUser).ParentUser).ParentUser).DayOfWeekNullable);
.Call ((($targetElement.ParentUser).ParentUser).ParentUser).set_Guid(((($sourceElement.ParentUser).ParentUser).ParentUser).Guid);
.Call ((($targetElement.ParentUser).ParentUser).ParentUser).set_GuidNullable(((($sourceElement.ParentUser).ParentUser).ParentUser).GuidNullable);
.If (((($sourceElement.ParentUser).ParentUser).ParentUser).MapPoint == null) {
.Call ((($targetElement.ParentUser).ParentUser).ParentUser).set_MapPoint(.Default(HigLabo.Mapper.Test.MapPoint))
} .Else {
.Block() {
.If (((($targetElement.ParentUser).ParentUser).ParentUser).MapPoint == null) {
((($targetElement.ParentUser).ParentUser).ParentUser).MapPoint = .New HigLabo.Mapper.Test.MapPoint()
} .Else {
.Default(System.Void)
};
.Call (((($targetElement.ParentUser).ParentUser).ParentUser).MapPoint).set_Longitude((((($sourceElement.ParentUser).ParentUser).ParentUser).MapPoint).Longitude);
.Call (((($targetElement.ParentUser).ParentUser).ParentUser).MapPoint).set_Latitude((((($sourceElement.ParentUser).ParentUser).ParentUser).MapPoint).Latitude)
}
};
.Call ((($targetElement.ParentUser).ParentUser).ParentUser).set_VectorToNullable(((($sourceElement.ParentUser).ParentUser).ParentUser).VectorToNullable);
.Call ((($targetElement.ParentUser).ParentUser).ParentUser).set_Vector2(((($sourceElement.ParentUser).ParentUser).ParentUser).Vector2);
.If (((($sourceElement.ParentUser).ParentUser).ParentUser).ParentUser == null) {
.Call ((($targetElement.ParentUser).ParentUser).ParentUser).set_ParentUser(.Default(HigLabo.Mapper.Test.User))
} .Else {
.Block() {
.If (((($targetElement.ParentUser).ParentUser).ParentUser).ParentUser == null) {
((($targetElement.ParentUser).ParentUser).ParentUser).ParentUser = .New HigLabo.Mapper.Test.User()
} .Else {
.Default(System.Void)
};
.Call (((($targetElement.ParentUser).ParentUser).ParentUser).ParentUser).set_Value((((($sourceElement.ParentUser).ParentUser).ParentUser).ParentUser).Value);
.Call (((($targetElement.ParentUser).ParentUser).ParentUser).ParentUser).set_Name((((($sourceElement.ParentUser).ParentUser).ParentUser).ParentUser).Name);
.Call (((($targetElement.ParentUser).ParentUser).ParentUser).ParentUser).set_Int32((((($sourceElement.ParentUser).ParentUser).ParentUser).ParentUser).Int32);
.Call (((($targetElement.ParentUser).ParentUser).ParentUser).ParentUser).set_Int32Nullable((((($sourceElement.ParentUser).ParentUser).ParentUser).ParentUser).Int32Nullable);
.Call (((($targetElement.ParentUser).ParentUser).ParentUser).ParentUser).set_Int32_Nullable((((($sourceElement.ParentUser).ParentUser).ParentUser).ParentUser).Int32_Nullable);
.Call (((($targetElement.ParentUser).ParentUser).ParentUser).ParentUser).set_Int32NullableToInt32((((($sourceElement.ParentUser).ParentUser).ParentUser).ParentUser).Int32NullableToInt32);
.Call (((($targetElement.ParentUser).ParentUser).ParentUser).ParentUser).set_DateTime((((($sourceElement.ParentUser).ParentUser).ParentUser).ParentUser).DateTime);
.Call (((($targetElement.ParentUser).ParentUser).ParentUser).ParentUser).set_DateTimeNullable((((($sourceElement.ParentUser).ParentUser).ParentUser).ParentUser).DateTimeNullable);
.Call (((($targetElement.ParentUser).ParentUser).ParentUser).ParentUser).set_Decimal((((($sourceElement.ParentUser).ParentUser).ParentUser).ParentUser).Decimal);
.Call (((($targetElement.ParentUser).ParentUser).ParentUser).ParentUser).set_DecimalNullable((((($sourceElement.ParentUser).ParentUser).ParentUser).ParentUser).DecimalNullable);
.Call (((($targetElement.ParentUser).ParentUser).ParentUser).ParentUser).set_DayOfWeek((((($sourceElement.ParentUser).ParentUser).ParentUser).ParentUser).DayOfWeek);
.Call (((($targetElement.ParentUser).ParentUser).ParentUser).ParentUser).set_DayOfWeekNullable((((($sourceElement.ParentUser).ParentUser).ParentUser).ParentUser).DayOfWeekNullable);
.Call (((($targetElement.ParentUser).ParentUser).ParentUser).ParentUser).set_Guid((((($sourceElement.ParentUser).ParentUser).ParentUser).ParentUser).Guid);
.Call (((($targetElement.ParentUser).ParentUser).ParentUser).ParentUser).set_GuidNullable((((($sourceElement.ParentUser).ParentUser).ParentUser).ParentUser).GuidNullable);
.If ((((($sourceElement.ParentUser).ParentUser).ParentUser).ParentUser).MapPoint == null) {
.Call (((($targetElement.ParentUser).ParentUser).ParentUser).ParentUser).set_MapPoint(.Default(HigLabo.Mapper.Test.MapPoint))
} .Else {
.Block() {
.If ((((($targetElement.ParentUser).ParentUser).ParentUser).ParentUser).MapPoint == null) {
(((($targetElement.ParentUser).ParentUser).ParentUser).ParentUser).MapPoint = .New HigLabo.Mapper.Test.MapPoint()
} .Else {
.Default(System.Void)
}
}
};
.Call (((($targetElement.ParentUser).ParentUser).ParentUser).ParentUser).set_VectorToNullable((((($sourceElement.ParentUser).ParentUser).ParentUser).ParentUser).VectorToNullable);
.Call (((($targetElement.ParentUser).ParentUser).ParentUser).ParentUser).set_Vector2((((($sourceElement.ParentUser).ParentUser).ParentUser).ParentUser).Vector2);
.If ((((($sourceElement.ParentUser).ParentUser).ParentUser).ParentUser).ParentUser == null) {
.Call (((($targetElement.ParentUser).ParentUser).ParentUser).ParentUser).set_ParentUser(.Default(HigLabo.Mapper.Test.User))
} .Else {
.Block() {
.If ((((($targetElement.ParentUser).ParentUser).ParentUser).ParentUser).ParentUser == null) {
(((($targetElement.ParentUser).ParentUser).ParentUser).ParentUser).ParentUser = .New HigLabo.Mapper.Test.User()
} .Else {
.Default(System.Void)
}
}
};
.If ((((($sourceElement.ParentUser).ParentUser).ParentUser).ParentUser).Dictionary == null) {
.Call (((($targetElement.ParentUser).ParentUser).ParentUser).ParentUser).set_Dictionary(.Default(System.Collections.Generic.Dictionary`2[System.String,System.String]))
} .Else {
.Block() {
.If ((((($targetElement.ParentUser).ParentUser).ParentUser).ParentUser).Dictionary == null) {
(((($targetElement.ParentUser).ParentUser).ParentUser).ParentUser).Dictionary = .New System.Collections.Generic.Dictionary`2[System.String,System.String]()
} .Else {
.Default(System.Void)
}
}
}
}
};
.If (((($sourceElement.ParentUser).ParentUser).ParentUser).Dictionary == null) {
.Call ((($targetElement.ParentUser).ParentUser).ParentUser).set_Dictionary(.Default(System.Collections.Generic.Dictionary`2[System.String,System.String]))
} .Else {
.Block() {
.If (((($targetElement.ParentUser).ParentUser).ParentUser).Dictionary == null) {
((($targetElement.ParentUser).ParentUser).ParentUser).Dictionary = .New System.Collections.Generic.Dictionary`2[System.String,System.String]()
} .Else {
.Default(System.Void)
}
}
}
}
};
.If ((($sourceElement.ParentUser).ParentUser).Dictionary == null) {
.Call (($targetElement.ParentUser).ParentUser).set_Dictionary(.Default(System.Collections.Generic.Dictionary`2[System.String,System.String]))
} .Else {
.Block() {
.If ((($targetElement.ParentUser).ParentUser).Dictionary == null) {
(($targetElement.ParentUser).ParentUser).Dictionary = .New System.Collections.Generic.Dictionary`2[System.String,System.String]()
} .Else {
.Default(System.Void)
}
}
}
}
};
.If (($sourceElement.ParentUser).Dictionary == null) {
.Call ($targetElement.ParentUser).set_Dictionary(.Default(System.Collections.Generic.Dictionary`2[System.String,System.String]))
} .Else {
.Block() {
.If (($targetElement.ParentUser).Dictionary == null) {
($targetElement.ParentUser).Dictionary = .New System.Collections.Generic.Dictionary`2[System.String,System.String]()
} .Else {
.Default(System.Void)
}
}
}
}
};
.If ($sourceElement.Dictionary == null) {
.Call $targetElement.set_Dictionary(.Default(System.Collections.Generic.Dictionary`2[System.String,System.String]))
} .Else {
.Block() {
.If ($targetElement.Dictionary == null) {
$targetElement.Dictionary = .New System.Collections.Generic.Dictionary`2[System.String,System.String]()
} .Else {
.Default(System.Void)
}
}
};
.Call ($target.Users).Add($targetElement);
$i += 1
}
}
.LabelTarget endLoop:;
.Label
.LabelTarget end:
};
.Block(
System.Guid $sourceElement,
System.Guid $targetElement,
System.Int32 $i) {
$i;
.If ($source.GuidList == null) {
.Return end { }
} .Else {
.Default(System.Void)
};
$i = 0;
.Loop {
.Block() {
.If (($source.GuidList).Count <= $i) {
.Break endLoop { }
} .Else {
.Default(System.Void)
};
$sourceElement = ($source.GuidList).Item[$i];
$targetElement = (System.Guid)$sourceElement;
.Call ($target.GuidList).Add($targetElement);
$i += 1
}
}
.LabelTarget endLoop:;
.Label
.LabelTarget end:
};
.If ($source.Tags != null) {
.Block(
System.String $sourceElement,
System.String $targetElement,
System.Int32 $i,
System.String[] $arrayMember) {
$i;
$i = 0;
$arrayMember;
$arrayMember = .NewArray System.String[($source.Tags).Length];
.Loop {
.Block() {
.If (($source.Tags).Length <= $i) {
.Break endLoop { }
} .Else {
.Default(System.Void)
};
$sourceElement = ($source.Tags)[$i];
$targetElement = $sourceElement;
$arrayMember[$i] = $targetElement;
$i += 1
}
}
.LabelTarget endLoop:;
$target.Tags = $arrayMember
}
} .Else {
.Default(System.Void)
};
.If ($source.Timestamp != null) {
.Block(
System.Byte $sourceElement,
System.Byte $targetElement,
System.Int32 $i,
System.Byte[] $arrayMember) {
$i;
$i = 0;
$arrayMember;
$arrayMember = .NewArray System.Byte[($source.Timestamp).Length];
.Loop {
.Block() {
.If (($source.Timestamp).Length <= $i) {
.Break endLoop { }
} .Else {
.Default(System.Void)
};
$sourceElement = ($source.Timestamp)[$i];
$targetElement = $sourceElement;
$arrayMember[$i] = $targetElement;
$i += 1
}
}
.LabelTarget endLoop:;
$target.Timestamp = $arrayMember
}
} .Else {
.Default(System.Void)
};
$target
}
}
这些块将被编译为Func<Object, Object, TTarget>的lambda func 。
并保存private _MapActionList字段。当然,这个编译过程在第一次时只有一次,然后重用保存_MapActionList的Func。 AddPostAction将结合这个Func和您的Lambda,ReplaceMap将替换这个Func。
概括
我希望这个库对某人的工作有所帮助,并使您更容易专注于您的产品。
https://www.codeproject.com/Articles/5275388/HigLabo-Mapper-Creating-Fastest-Object-Mapper-in-t