HigLabo.Mapper,用表达式树在10天内创建世界上最快的对象映射器

目录

介绍

背景

如何使用?

与其他映射器的比较

性能!!!

初始配置

自定义

多重设置

映射测试用例

深入研究生成的表达式树

概括


介绍

四年前(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

您可以从支持DateOnlyTimeOnly类型的Nuget中使用。

您可以从Nuget下载。

HigLabo.Mapper(版本6.1.xx

背景

现在一天,无论你是WebDesktopMobile的开发者,你都可能会用到一些POCODTO对象。而且您必须将属性值从一个对象转移到另一个对象。对象映射器对于这种情况很有用。这一次,我重新实现的目标如下:

  1. 世界上最快的
  2. 零配置提高生产力
  3. 针对各种用例的完全自定义
  4. 应用程序的多个映射规则

如何使用?

您可以从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易于使用。

与其他映射器的比较

在本章中,我将解释与其他映射器库的区别。这是比较总结。

  1. 性能
  2. 初始配置
  3. 自定义
  4. 多重设置

性能!!!

它对映射器库很重要,因为它倾向于在更深的地方使用,例如内部循环。性能测试的总结在这里。

  • AutoMapper34(对于没有集合属性的POCO
  • Mapster10%-20%(对于没有集合属性的POCO
  • AgileMapperFastMapperTinyMapper7-10(对于没有集合属性的POCO 
  • AutoMapper3(对于具有集合属性的POCO
  • Mapster10倍(对于具有集合属性的POCO
  • AgileMapperFastMapperTinyMapper 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都是最快的。

您可以在https://github.com/higty/higlabo/tree/master/NetStandard/HigLabo.Test/HigLabo.Mapper.PerformanceTest看到整个测试代码 

初始配置

一些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自定义映射规则非常复杂。我比较了这个页面AutoMapperHigLabo.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内部的AddPostActionReplaceMap方法上设置断点。

您还可以像这样自定义属性映射规则:

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
    }
}

AddressAddressDTO 将生成此表达式树为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字段。当然,这个编译过程在第一次时只有一次,然后重用保存_MapActionListFunc AddPostAction将结合这个Func和您的LambdaReplaceMap将替换这个Func

概括

我希望这个库对某人的工作有所帮助,并使您更容易专注于您的产品。

https://www.codeproject.com/Articles/5275388/HigLabo-Mapper-Creating-Fastest-Object-Mapper-in-t

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值