允许使用AutoMapper或类似的映射动态类型?

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)

  • @nemesv"[.​​..] ExpandoObject,它不提供它拥有的属性)[...]"<--- ExpandoObject实现`IDictionary <string,object>`所以你可以强制转换到这个接口并使用`ContainsKey `. (4认同)

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)

  • @nawfal 可以自定义“_”约定,例如`Slapper.AutoMapper.Configuration.IdentifierConventions.Add( type =&gt; type.Name + "_Id" );`,参见http://randyburden.com/Slapper.AutoMapper/ . (2认同)