允许使用AutoMapper或类似的动态类型的映射? [英] Allow mapping of dynamic types using AutoMapper or similar?

查看:248
本文介绍了允许使用AutoMapper或类似的动态类型的映射?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我已经开始使用 https://github.com/robconery/massive 一个项目我不知道是否有任何映射工具,允许动态支持静态类型映射?

我使用AutoMapper previously,确实AutoMapper支持呢?

我知道从AutoMapper的DynamicMap功能,但是我相信这个功能是用于运行图不首先创建的地图。在我的例子下面这是行不通的。

 动态curUser = users.GetSingleUser(用户名);
VAR retUser = Mapper.DynamicMap<&的usermodel GT;(curUser);
users.GetSingleUser(用户名); //返回动态对象


解决方案

AutoMapper 4.2.0 现在支持的动态/的expando /字典映射

通过此功能,您可以映射到你的expando对象的静态类型:

 动态CurUser = _users.GetSingleUser(用户名);
变种配置=新MapperConfiguration(CFG = GT; {});
变种映射器= config.CreateMapper();VAR retUser = mapper.Map<&的usermodel GT;(CurUser);

AutoMapper的旧版本不支持这个(大规模内部使用 ExpandoObject 不提供它具有的属性),你是正确的 Mapper.DynamicMap 是映射,而无需创建映射配置。

其实这并不难写自己一个映射,如果你只是想简单的映射:

 公共静态类DynamicToStatic
{
    公共静态ŧToStatic< T>(对象的expando)
    {
        VAR实体= Activator.CreateInstance< T>();        // ExpandoObject实现词典
        VAR性能=的expando作为IDictionary的<字符串对象&gt ;;        如果(属性== NULL)
            返回实体;        的foreach(在性能VAR进入)
        {
            VAR的PropertyInfo = entity.GetType()的getProperty(entry.Key)。
            如果(的PropertyInfo!= NULL)
                propertyInfo.SetValue(实体entry.Value,NULL);
        }
        返回实体;
    }
}动态CurUser = _users.GetSingleUser(用户名);
VAR retUser = DynamicToStatic.ToStatic<&的usermodel GT;(CurUser);

I've started to use https://github.com/robconery/massive for a project, I wonder if there is any mapping tool that allows support for Dynamic to static type mapping?

I've used AutoMapper previously, does AutoMapper support this?

I am aware of the DynamicMap function from AutoMapper, however I believe this function is for running maps without creating the Map first. In my example below it does not work.

dynamic curUser = users.GetSingleUser(UserID);   
var retUser = Mapper.DynamicMap<UserModel>(curUser);
users.GetSingleUser(UserID); // returns a dynamic object

解决方案

AutoMapper 4.2.0 now supports Dynamic/expando/dictionary mapping

With this feature you can map to your expando objects to static types:

dynamic CurUser = _users.GetSingleUser(UserID);   
var config = new MapperConfiguration(cfg => { });
var mapper = config.CreateMapper();

var retUser = mapper.Map<UserModel>(CurUser);

Old versions of AutoMapper do not support this (Massive internally uses ExpandoObject which doesn't provide which properties it has), and you are right Mapper.DynamicMap is for mapping without creating mapping configuration.

Actually it's not hard to write yourself a mapper if you just want simple mapping:

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);

这篇关于允许使用AutoMapper或类似的动态类型的映射?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆