Lia*_*amB 41 c# automapper massive
我已经开始使用https://github.com/robconery/massive进行项目,我想知道是否有任何映射工具允许支持动态到静态类型映射?
我之前使用过AutoMapper,AutoMapper是否支持此功能?
我知道AutoMapper中的DynamicMap函数,但我相信这个函数用于运行地图而不先创建Map.在我下面的例子中,它不起作用.
dynamic curUser = users.GetSingleUser(UserID);
var retUser = Mapper.DynamicMap<UserModel>(curUser);
users.GetSingleUser(UserID); // returns a dynamic object
Run Code Online (Sandbox Code Playgroud)
nem*_*esv 67
AutoMapper 4.2.0现在支持动态/扩展/字典映射
使用此功能,您可以将expando对象映射到静态类型:
dynamic CurUser = _users.GetSingleUser(UserID);
var config = new MapperConfiguration(cfg => { });
var mapper = config.CreateMapper();
var retUser = mapper.Map<UserModel>(CurUser);
Run Code Online (Sandbox Code Playgroud)
旧版本的AutoMapper不支持此功能(Massive内部使用ExpandoObject不提供它具有的属性),而您正确Mapper.DynamicMap用于映射而不创建映射配置.
实际上,如果你只是想要简单的映射,那么写一个mapper并不难:
public static class DynamicToStatic
{
public static T ToStatic<T>(object expando)
{
var entity = Activator.CreateInstance<T>();
//ExpandoObject implements dictionary
var properties = expando as IDictionary<string, object>;
if (properties == null)
return entity;
foreach (var entry in properties)
{
var propertyInfo = entity.GetType().GetProperty(entry.Key);
if(propertyInfo!=null)
propertyInfo.SetValue(entity, entry.Value, null);
}
return entity;
}
}
dynamic CurUser = _users.GetSingleUser(UserID);
var retUser = DynamicToStatic.ToStatic<UserModel>(CurUser);
Run Code Online (Sandbox Code Playgroud)
Tod*_*son 17
试试Slapper.AutoMapper https://github.com/randyburden/Slapper.AutoMapper
Slapper.AutoMapper将动态数据映射到静态类型
它适用于两者dynamic,Dictionary<A, B>而且非常棒.
以下是一个示例(取自上面的URL),显示它与Dictionary的协作方式:
public class Person
{
public int Id;
public string FirstName;
public string LastName;
}
[Test]
public void CanMapMatchingFieldNamesWithEase()
{
// Arrange
var dictionary = new Dictionary<string, object>
{
{ "Id", 1 },
{ "FirstName", "Clark" },
{ "LastName", "Kent" }
};
// Act
var person = Slapper.AutoMapper.Map<Person>( dictionary );
// Assert
Assert.NotNull( person );
Assert.That( person.Id == 1 );
Assert.That( person.FirstName == "Clark" );
Assert.That( person.LastName == "Kent" );
}
Run Code Online (Sandbox Code Playgroud)