C# 发射贴图器修饰和属性名称不匹配

C# 发射贴图器修饰和属性名称不匹配,c#,mapper,emitmapper,C#,Mapper,Emitmapper,如何使用Emit Mapper将用户类映射到UserModel类 公共类用户 { 公共Guid Id{get;set;} 公共字符串名{get;set;} 公共字符串LastName{get;set;} 公共IList角色{get;set;} 上市公司{get;set;} } 公共类用户模型 { 公共Guid Id{get;set;} 公共Guid公司ID{get;set;} 公共字符串名{get;set;} 公共字符串LastName{get;set;} 公共IList角色{get;set;}

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

公共类用户
{
公共Guid Id{get;set;}
公共字符串名{get;set;}
公共字符串LastName{get;set;}
公共IList角色{get;set;}
上市公司{get;set;}
}
公共类用户模型
{
公共Guid Id{get;set;}
公共Guid公司ID{get;set;}
公共字符串名{get;set;}
公共字符串LastName{get;set;}
公共IList角色{get;set;}
}
有几个问题:

  • 我需要将对象展平,这样我将拥有CompanyId而不是Company对象
  • Company对象具有属性Id,在UserModel中,我具有与公司Id对应的CompanyId,但属性名称不匹配
  • 我需要将
    列表
    映射到
    列表

要将模型展平,您可以检查。但默认情况下,它有一个约定,即在目标中使用子类属性名称作为前缀

来源

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

public SourceSubObject
{
    public int Age { get; set; }
}
var mapper = new DefaultMapConfig().ConvertUsing<Source, Target>(Converter);
var target = ObjectMapperManager.DefaultInstance.GetMapper<Source, Target>(mapper).Map(source);
目标

public class Target
{
public int SomeClassAge  { get; set; }
}
其次,一个选项是让默认设置复制它可以复制的属性,然后手动执行其余操作

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

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

public SourceSubObject
{
    public int Age { get; set; }
}
var mapper = new DefaultMapConfig().ConvertUsing<Source, Target>(Converter);
var target = ObjectMapperManager.DefaultInstance.GetMapper<Source, Target>(mapper).Map(source);
var mapper=new DefaultMapConfig().ConvertUsing(Converter);
var target=ObjectMapperManager.DefaultInstance.GetMapper(映射器).Map(源);
更新

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

public SourceSubObject
{
    public int Age { get; set; }
}
var mapper = new DefaultMapConfig().ConvertUsing<Source, Target>(Converter);
var target = ObjectMapperManager.DefaultInstance.GetMapper<Source, Target>(mapper).Map(source);
角色和角色模型映射的内容。在这种情况下,您似乎需要启用深度复制,并且根据类的定义,您可以直接复制它或进行一些自定义映射

ObjectMapperManager.DefaultInstance.GetMapper<Source, Target>(new DefaultMapConfig().DeepMap<ClassToDeepMap>().DeepMap<ClassToDeepMap>()).Map(source, target);
ObjectMapperManager.DefaultInstance.GetMapper(新的DefaultMapConfig().DeepMap().DeepMap()).Map(源,目标);

要将模型展平,您可以检查。但默认情况下,它有一个约定,即在目标中使用子类属性名称作为前缀

来源

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

public SourceSubObject
{
    public int Age { get; set; }
}
var mapper = new DefaultMapConfig().ConvertUsing<Source, Target>(Converter);
var target = ObjectMapperManager.DefaultInstance.GetMapper<Source, Target>(mapper).Map(source);
目标

public class Target
{
public int SomeClassAge  { get; set; }
}
其次,一个选项是让默认设置复制它可以复制的属性,然后手动执行其余操作

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

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

public SourceSubObject
{
    public int Age { get; set; }
}
var mapper = new DefaultMapConfig().ConvertUsing<Source, Target>(Converter);
var target = ObjectMapperManager.DefaultInstance.GetMapper<Source, Target>(mapper).Map(source);
var mapper=new DefaultMapConfig().ConvertUsing(Converter);
var target=ObjectMapperManager.DefaultInstance.GetMapper(映射器).Map(源);
更新

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

public SourceSubObject
{
    public int Age { get; set; }
}
var mapper = new DefaultMapConfig().ConvertUsing<Source, Target>(Converter);
var target = ObjectMapperManager.DefaultInstance.GetMapper<Source, Target>(mapper).Map(source);
角色和角色模型映射的内容。在这种情况下,您似乎需要启用深度复制,并且根据类的定义,您可以直接复制它或进行一些自定义映射

ObjectMapperManager.DefaultInstance.GetMapper<Source, Target>(new DefaultMapConfig().DeepMap<ClassToDeepMap>().DeepMap<ClassToDeepMap>()).Map(source, target);
ObjectMapperManager.DefaultInstance.GetMapper(新的DefaultMapConfig().DeepMap().DeepMap()).Map(源,目标);
  • 为了讨人喜欢,我使用了Emit Mapper源文件中示例中的配置:

  • 要使名称与公司类中的名称匹配,字段应为名称
    Id

  • 为了将
    List
    映射到
    List
    ,我使用了自定义转换器:

    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;
        }
    }
    
    公共类EntityListToModelListConverter
    {
    公共列表转换(IList-from,对象状态)
    {
    if(from==null)
    返回null;
    var models=新列表();
    var mapper=ObjectMapperManager.DefaultInstance.GetMapper();
    for(int i=0;i
    因此,总而言之:

     var userMapper = ObjectMapperManager.DefaultInstance.GetMapper<User, UserModel>( 
                 new FlatteringConfig().ConvertGeneric(typeof(IList<>), typeof(IList<>), 
                 new DefaultCustomConverterProvider(typeof(EntityListToModelListConverter<,>))));
    
    var userMapper=ObjectMapperManager.DefaultInstance.GetMapper(
    新的奉承配置().ConvertGeneric(typeof(IList),typeof(IList),
    新的DefaultCustomConverterProvider(typeof(EntityListToModelListConverter));
    
  • 使用带有自定义转换器的平坦化配置时出现问题,请检查我的问题:

      • 为了讨人喜欢,我使用了Emit Mapper源文件中示例中的配置:

      • 要使名称与公司类中的名称匹配,字段应为名称
        Id

      • 为了将
        List
        映射到
        List
        ,我使用了自定义转换器:

        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;
            }
        }
        
        公共类EntityListToModelListConverter
        {
        公共列表转换(IList-from,对象状态)
        {
        if(from==null)
        返回null;
        var models=新列表();
        var mapper=ObjectMapperManager.DefaultInstance.GetMapper();
        for(int i=0;i
        因此,总而言之:

         var userMapper = ObjectMapperManager.DefaultInstance.GetMapper<User, UserModel>( 
                     new FlatteringConfig().ConvertGeneric(typeof(IList<>), typeof(IList<>), 
                     new DefaultCustomConverterProvider(typeof(EntityListToModelListConverter<,>))));
        
        var userMapper=ObjectMapperManager.DefaultInstance.GetMapper(
        新的奉承配置().ConvertGeneric(typeof(IList),typeof(IList),
        新的DefaultCustomConverterProvider(typeof(EntityListToModelListConverter));
        
      • 使用带有自定义转换器的平坦化配置时出现问题,请检查我的问题:


      我有一个类似的问题…你解决了吗?我有一个类似的问题…你解决了吗?谢谢,这解决了我的问题。无论如何,我仍然不清楚如何指定TEntity和TModel的映射方式。。。假设我有一个类型A和一个类型B的集合,我想把它映射到一个有一个BMapped集合的AMAMAPED…我应该如何设置配置?我应该使用后处理吗?我非常喜欢这个库的想法,但它确实缺少配置和示例……这取决于集合的类型。在我的示例中,我有一个泛型集合,所以我对泛型类型使用了自定义转换器。您需要提供自定义转换器以从B转换为BMapped,如果是泛型,则将其注册为
      new fatteringconfig().ConvertGeneric(typeof(B)、typeof(BMapped)、new DefaultCustomConverterProvider(typeof(CustomConverterClass))
      方法I中的