天天看点

C#编程,开源实体映射框架EmitMapper 使用方法

1、介绍

用于将实体映射到彼此的强大的可定制工具。实体可以是纯对象,DataReaders,SQL命令以及任何您需要的。该工具通过Emit库生成运行时代码。处理DTO对象,数据访问层等都是有用的。

优点:快,使用方便,灵活;

缺点:11年就不在维护……

Emit Mapper可以自动转换以下类型:

  • 任何使用ToString()方法进行字符串处理。
  • 使用System.Convert类的基本类型。
  • Nullable类型对值类型,反之亦然。
  • 枚举为其底层类型,反之亦然。
  • 枚举到字符串,反之亦然。
  • 不同类型的集合(数组,ArrayList,List <>,IEnumerable)
  • 类到结构,反之亦然。
  • 具有复杂嵌套成员的复杂类型使用具有浅或深对应的递归映射。

2、网址

官网源代码

3、使用

通过控制台

PM> Install-Package EmitMapper
           

或者:

C#编程,开源实体映射框架EmitMapper 使用方法

4、使用步骤

默认的映射配置器能自动转换以下几种类型:

  • 任何类型到string类型使用ToString()方法;
  • 可以使用System.Convert类转换的原始类型;
  • 可空类型、枚举类型、各种集合类型、结构与类;
  • 复杂的嵌套类型采用递归方式转换;
  • 如果默认的转换满足不了需求,默认的映射配置器还允许指定命名约定,自定义构造函数,自定义转换器,忽略成员等。
C#编程,开源实体映射框架EmitMapper 使用方法

4.1普通的映射

字段名称有相同的

public class UserInfo
    {
        public int id { get; set; }
        public string name { get; set; }
        public string address { get; set; }
    }

    public class UserInfoDTO
    {        
        public string name { get; set; }
        public string address { get; set; }
    }

    var mapper = ObjectMapperManager.DefaultInstance.GetMapper<UserInfo, UserInfoDTO>();
    UserInfoDTO userdto = mapper.Map(user);
           

4.2忽略掉某个字段的映射

public class UserInfo
    {
        public int id { get; set; }
        public string name { get; set; }
        public string address { get; set; }
    }
    public class UserInfoDTO
    {
        public string id { get; set; }
        public string name { get; set; }
        public string address { get; set; }
    }
    var user = new UserInfo { 
                id = 12, 
                name = "张三", 
                address = "北京"
            };

    var mapper = ObjectMapperManager.DefaultInstance.GetMapper<UserInfo, UserInfoDTO>(
                new DefaultMapConfig()
                .IgnoreMembers<UserInfo, UserInfoDTO>(new string[] { "name" })
            );
    UserInfoDTO userdto = mapper.Map(user);
           

4.3给空元素赋默认值

public class UserInfo
    {
        public int id { get; set; }
        public string name { get; set; }
        public string address { get; set; }
        public DateTime? godate { get; set; }
    }
    public class UserInfoDTO
    {
        public string id { get; set; }
        public string name { get; set; }
        public string address { get; set; }
        public DateTime godate { get; set; }
    }
    var user = new UserInfo { 
                id = 12, 
                name = "张三", 
                address = null,
                godate = null
            };

    var mapper = ObjectMapperManager.DefaultInstance.GetMapper<UserInfo, UserInfoDTO>(
                new DefaultMapConfig()
                //如果日期为空设置为当前时间
                .NullSubstitution<DateTime?, DateTime>((value) => DateTime.Now)
                //如果string类型为null赋值为“”
                .NullSubstitution<string, string>((value) => "")
            );
    UserInfoDTO userdto = mapper.Map(user);
           

4.4两个实体之间名字不一致,需要映射

public class UserInfo
    {
        public int id { get; set; }
        public string name { get; set; }
        public string address { get; set; }
    }
    public class UserInfoDTO
    {
        public int id { get; set; }
        public string name { get; set; }
        public string userAddress { get; set; }
    }
    var mapper = ObjectMapperManager.DefaultInstance.GetMapper<UserInfo, UserInfoDTO>(
                new DefaultMapConfig()
                .MatchMembers((x, y) =>
                {
                    if (x == "address" && y == "userAddress")
                    {
                        return true;
                    }
                    return x == y;
                })
                );
    UserInfoDTO userdto = mapper.Map(user);
           

4.4有外键关联,需要映射出外键所带名字

public class UserInfo
    {
        public int id { get; set; }
        public string name { get; set; }
        public string address { get; set; }

        public Teacher teacher { get; set; }
    }
    public class Teacher
    {
        public int id { get; set; }
        public string name { get; set; }
    }
    public class UserInfoDTO
    {
        public int id { get; set; }
        public string name { get; set; }
        public string teacher { get; set; }
    }

    var user = new UserInfo { 
                id = 12, 
                name = "张三", 
                address = "北京",
                teacher = new Teacher { 
                    id = 11, 
                    name = "王五" 
                }
            };

     var mapper = ObjectMapperManager.DefaultInstance.GetMapper<UserInfo, UserInfoDTO>(
                new DefaultMapConfig()
                .ConvertUsing<Teacher, string>(t => t.name)
                );
     UserInfoDTO userdto = mapper.Map(user);
           

4.3多种特殊情况并存

public class Sourse
{
    public int A;
    public decimal? B;
    public string C;
    public Inner D;
    public string E;
}

public class Dest
{
    public int? A;
    public decimal B;
    public DateTime C;
    public Inner2 D;
    public string F;
}

public class Inner
{
    public long D1;
    public Guid D2;
}

public class Inner2
{
    public long D12;
    public Guid D22;
}

ObjectsMapper<Sourse, Dest> mapper1 = 
    new ObjectMapperManager().GetMapper<Sourse, Dest>(
        new DefaultMapConfig()
        .IgnoreMembers<Sourse, Dest>(new string[] { "A" })
        .NullSubstitution<decimal?, decimal>((value) => -1M)
        .ConvertUsing<Inner, Inner2>(value => new Inner2 { D12 = value.D1, D22 = value.D2 })
        .PostProcess<Dest>((value, state) => { value.F = "nothing"; return value; })
        );
Dest dst = mapper1.Map(src);
           

参考

5、EmitMapper 和TinyMapper 两者简单对比

原文章:EmitMapper 和TinyMapper 两者简单对比

C#编程,开源实体映射框架EmitMapper 使用方法