Emit Mapper Flattering和属性名称不匹配

时间:2012-03-08 14:33:32

标签: c# mapper emitmapper

如何使用Emit Mapper将User类映射到UserModel类?

    public class User
    {
        public Guid Id { get; set; }

        public string FirstName { get; set; }

        public string LastName { get; set; }

        public IList<Role> Roles { get; set; }

        public Company Company { get; set; }        
    }

    public class UserModel
    {
        public Guid Id { get; set; }

        public Guid CompanyId { get; set; }

        public string FirstName { get; set; }

        public string LastName { get; set; }      

        public IList<RoleModel> Roles { get; set; }
}

有几个问题:

  • 我需要展平对象,以便我将使用CompanyId而不是Company对象。
  • 公司对象具有属性ID,在UserModel中我有CompanyId,它对应于公司ID,但属性名称不匹配。
  • 我需要将List<Role>映射到List<RoleModel>

2 个答案:

答案 0 :(得分:1)

要获得扁平模型,您可以查看this example。但似乎默认情况下它有一个约定,即将子类属性名称作为目标中的前缀。

<强>来源

public class SourceObject
{
public SourceSubObject SomeClass { get; set; }
}

public SourceSubObject
{
    public int Age { get; set; }
}

:定位

public class Target
{
public int SomeClassAge  { get; set; }
}

其次,一个选项是让默认设置复制它可以复制的那些属性并手动完成剩下的

var target = ObjectMapperManager.DefaultInstance.GetMapper<Source, Target>().Map(source);
target.CompanyId = target.Company.CompanyId;

或者,如果您需要重新使用映射,请创建自定义映射器

自定义映射器

private Target Converter(Source source)
{
   var target = new Target();
   target.CompanyId = source.Company.CompanyId;
   return target;
}

<强>用法

var mapper = new DefaultMapConfig().ConvertUsing<Source, Target>(Converter);
var target = ObjectMapperManager.DefaultInstance.GetMapper<Source, Target>(mapper).Map(source);

<强>更新

角色和角色是什么? RoleModel映射。在这种情况下,您似乎需要启用深层复制,并且根据类(s)定义,您可以直接复制它或执行一些自定义映射。

ObjectMapperManager.DefaultInstance.GetMapper<Source, Target>(new DefaultMapConfig().DeepMap<ClassToDeepMap>().DeepMap<ClassToDeepMap>()).Map(source, target);

答案 1 :(得分:0)

  • 对于奉承我使用的是Emit Mapper源文件中的示例配置:http://emitmapper.codeplex.com/SourceControl/changeset/view/69894#1192663

  • 要使公司类中匹配的名称应为名称为Id

  • 的字段
  • 要将List<Role>映射到List<RoleModel>我正在使用自定义转换器:

    public class EntityListToModelListConverter<TEntity, TModel>
    {
        public List<TModel> Convert(IList<TEntity> from, object state)
        {
            if (from == null)
                return null;
    
            var models = new List<TModel>();
            var mapper = ObjectMapperManager.DefaultInstance.GetMapper<TEntity, TModel>();
    
            for (int i = 0; i < from.Count(); i++)
            {
                models.Add(mapper.Map(from.ElementAt(i)));
            }
    
            return models;
        }
    }
    

    所有在一起:

     var userMapper = ObjectMapperManager.DefaultInstance.GetMapper<User, UserModel>( 
                 new FlatteringConfig().ConvertGeneric(typeof(IList<>), typeof(IList<>), 
                 new DefaultCustomConverterProvider(typeof(EntityListToModelListConverter<,>))));
    
  • 使用带自定义转换器的Flatterning配置时出现问题,请查看我的问题:Emit Mapper Flattering with Custom Converters