65.9K
CodeProject 正在变化。 阅读更多。
Home

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

starIconstarIconstarIconstarIcon
emptyStarIcon
starIcon

4.97/5 (21投票s)

2020年8月1日

CPOL

4分钟阅读

viewsIcon

40955

世界上最快的映射器,易于使用,零配置,完全可定制

引言

目前,最新版本的HigLabo.Mapper支持.NET8。您可以从Nuget使用它。

四年前(2015年),我用IL代码创建了对象映射器的初始版本。就在几周前,我决定使用表达式树重新实现HigLabo.Mapper,并取得了巨大的性能提升。它目前在全球范围内速度最快。GitHub仓库是https://github.com/higty/higlabo
您可以在https://github.com/higty/higlabo.netstandard/tree/master/HigLabo.Mapper查看我10天的提交日志

目前,我刚刚在.NET6上发布了HigLabo.Mapper。最新版本的HigLabo.Mapper在这里。

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

您可以从Nuget下载。

HigLabo.Mapper(版本6.1.x.x)

背景

如今,无论您是Web、桌面还是移动开发人员,您都可能使用一些POCO、DTO对象。并且您必须将属性值从一个对象传输到另一个对象。在这种情况下,对象映射器非常有用。这一次,我重新实现的目的是如下:

  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支持DictionaryObject的映射。

var d = new Dictionary<String, String>(); 
d["Name"] = "Bill";
var person = d.Map(new Person());
//person.Name is "Bill"

也支持ObjectDictionary的映射。

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. 多重设置

性能!!!

这对映射器库很重要,因为它往往会在循环内部等更深层的地方使用。性能测试摘要在此。

  • 比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是新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; }
    }

我测试了以下四种类型的映射

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());

正如您所见,所有四种情况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的自定义映射规则非常复杂。我在这页的示例中比较了AutoMapperHigLabo.Mapper

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,您必须了解AutoMapper库,例如Mapper.InitializeForMemberCreateMapAfterMap等。

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

这种设计的另一个优点是您可以轻松调试代码。您可以在AddPostActionReplaceMap方法的Lambda中设置断点。

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

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());

Map扩展方法声明在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个Dictionary自定义映射用例之外,前版本支持的所有用例。

但是我认为,由于这是初始版本,可能包含一些罕见的异常情况。如果您遇到异常,请随时在CodeProject或GitHub问题上提问。

深入了解生成的表达式树

测试用例在这里。

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

地址到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_VectorToNullabl
                          e($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函数。

并保存到private _MapActionList字段。当然,此编译过程仅在第一次时进行,然后重用保存在_MapActionList中的FuncAddPostAction将此Func和您的Lambda结合起来,ReplaceMap将替换此Func

摘要

我希望这个库能帮助某人的工作,并让他们更容易专注于自己的产品。

历史

  • 2020年8月1日:初次发布
  • 2020年8月18日:HigLabo.Mapper(版本3.0.0.7)发布
  • 2021年12月29日:HigLabo.Mapper(版本6.1.0.0)发布
© . All rights reserved.