使用自动映射器

时间:2018-07-13 21:04:39

标签: c# automapper

我有一个具有某些属性的列表,例如

public Class Person 
{
    public string FirstName { get; set; }
    public string LastName { get; set; }
    public List<Address> Addresses {get;set}
    public DateTime CreatedOn { get; set; }
    public string CreatedBy { get; set; } 
}

public class Address
{
    public string StreeNo { get; set; }
    public string Town { get; set; }
    public DateTime CreatedOn { get; set; }
    public string CreatedBy { get; set; }
}

我需要将其映射到不应具有CreatedOn和CreatedBy自动映射器的动态对象,我已经看到了使用

的示例
public static List<T> MapDynamicList<T>(IEnumerable<object> obj)
{
    var config = new MapperConfiguration(c => c.CreateMissingTypeMaps = true);
    var mapper = config.CreateMapper();

    var newModel = obj.Select(mapper.Map<T>).ToList();

    return newModel;
}

但是此映射具有与源相同的属性,因为我不希望将CreatedOn和CreatedBy复制到目标

所有这些原因背后的原因是,我试图创建一个没有提到属性的视图模型,因为我所有的类都具有CreatedOn Created By,并且随着类的更新,很难为每个模型手动创建视图模型。

我们将不胜感激

1 个答案:

答案 0 :(得分:0)

如果您在目的地不需要这些属性,则只需创建不具有此类属性的viewmodel :)

public class AddressViewModel
{
    public string StreeNo { get; set; }
    public string Town { get; set; }
}

public Class PersonViewModel
{
    public string FirstName { get; set; }
    public string LastName { get; set; }
    public AddressViewModel[] Addresses { get; set; }
}

// Automapper profile
CreateMap<Address, AddressViewModel();
CreateMap<Person, PersonViewModel>();

// Usage
var personViewModelList = MapDynamicList<PersonViewModel>(persons);

您也可以使用Automapper .Ignore(),但是使用显式ViewModel类的解决方案似乎更加清晰。

顺便说一句,您不需要使用LINQ。选择以映射IEnumerable,Automapper可以映射集合,所以代替此:

var newModel = obj.Select(mapper.Map<T>).ToList();

您可以这样做:

var newModel = mapper.Map<List<T>>(obj);

这会将每个对象映射到T,然后将它们放入列表中。