如何使用 AutoMapper 创建从模型到实体、实体到模型的映射?
How to create a map from model to Entity, and Entity to model, with AutoMapper?
我有模型
class Account
{
public string Name { get; set; }
public string EmailAddress1 { get; set; }
}
是否可以将 AutoMapper 配置为以某种方式循环遍历我的 class 上的每个 属性 并将其映射到正确的实体值。
我可以自己制作一个带有反射的转换器:
public Entity ConvertToEntity()
{
var propertyDict = typeof(Account).GetProperties()
.Select(x => new KeyValuePair<string, object>(x.Name, x.GetValue(typeof(Account))));
var entity = new Entity();
foreach (var prop in propertyDict) t[prop.Key] = prop.Value;
return entity;
}
但是如何使用 AutoMapper 的 CreateMap 实现相同的功能?
假设你创建了像
这样的标记界面
// marker interface
public interface ICrmBusinessObject { }
public class MyAccount : ICrmBusinessObject
{
public string EmailAddress1 { get; set; }
}
然后你可以定义自定义映射器函数来转换那些:
Mapper.Initialize(cfg => {
cfg.CreateMap<ICrmBusinessObject, Entity>()
.AfterMap((crmEntity, entity) =>
{
var type = crmEntity.GetType();
var propertyDict = type.GetProperties()
.Select(x => new KeyValuePair<string, object>(x.Name.ToLowerInvariant(),
x.GetValue(crmEntity)));
foreach (var prop in propertyDict)
{
entity[prop.Key] = prop.Value;
}
});
});
您可以像这样使用映射器:
var myEntity = new MyAccount { EmailAddress1 = "me@contosco.com" };
var convertedEntity = Mapper.Map<Entity>(myEntity);
// me@contosco.com
Console.Out.WriteLine(convertedEntity["emailaddress1"]);
我有模型
class Account
{
public string Name { get; set; }
public string EmailAddress1 { get; set; }
}
是否可以将 AutoMapper 配置为以某种方式循环遍历我的 class 上的每个 属性 并将其映射到正确的实体值。
我可以自己制作一个带有反射的转换器:
public Entity ConvertToEntity()
{
var propertyDict = typeof(Account).GetProperties()
.Select(x => new KeyValuePair<string, object>(x.Name, x.GetValue(typeof(Account))));
var entity = new Entity();
foreach (var prop in propertyDict) t[prop.Key] = prop.Value;
return entity;
}
但是如何使用 AutoMapper 的 CreateMap 实现相同的功能?
假设你创建了像
这样的标记界面// marker interface
public interface ICrmBusinessObject { }
public class MyAccount : ICrmBusinessObject
{
public string EmailAddress1 { get; set; }
}
然后你可以定义自定义映射器函数来转换那些:
Mapper.Initialize(cfg => {
cfg.CreateMap<ICrmBusinessObject, Entity>()
.AfterMap((crmEntity, entity) =>
{
var type = crmEntity.GetType();
var propertyDict = type.GetProperties()
.Select(x => new KeyValuePair<string, object>(x.Name.ToLowerInvariant(),
x.GetValue(crmEntity)));
foreach (var prop in propertyDict)
{
entity[prop.Key] = prop.Value;
}
});
});
您可以像这样使用映射器:
var myEntity = new MyAccount { EmailAddress1 = "me@contosco.com" };
var convertedEntity = Mapper.Map<Entity>(myEntity);
// me@contosco.com
Console.Out.WriteLine(convertedEntity["emailaddress1"]);