【问题标题】:automapper map dynamic object自动映射器映射动态对象
【发布时间】:2013-01-15 00:39:51
【问题描述】:

我正在使用 Automapper,需要实现以下映射,但不确定如何完成。

我想将一个 Dictionary 对象映射到一个动态对象上,这样键是对象上的属性,字典的值是动态对象中属性的值。

这可以通过 automapper 实现吗?如果可以,如何实现?

【问题讨论】:

  • 在这种情况下,您需要动态对象是否有特殊原因?如我所见,字典的类型为Dictionary<PropertyInfo, object>

标签: c# dynamic dictionary automapper


【解决方案1】:

您可以简单地从ExpandoObject 获取Dictionary 并用原始字典值填充它

void Main()
{
    AutoMapper.Mapper.CreateMap<Dictionary<string, object>, dynamic>()
                     .ConstructUsing(CreateDynamicFromDictionary);

    var dictionary = new Dictionary<string, object>();
    dictionary.Add("Name", "Ilya");

    dynamic dyn = Mapper.Map<dynamic>(dictionary);

    Console.WriteLine (dyn.Name);//prints Ilya
}

public dynamic CreateDynamicFromDictionary(IDictionary<string, object> dictionary)
{
    dynamic dyn = new ExpandoObject();
    var expandoDic = (IDictionary<string, object>)dyn;

    dictionary.ToList()
              .ForEach(keyValue => expandoDic.Add(keyValue.Key, keyValue.Value));
    return dyn;
}

【讨论】:

    【解决方案2】:

    这是一个示例,但如果您删除评论或详细说明您的帖子,它可能更具描述性。给定这个类:

    class Foo
    {
        public Foo(int bar, string baz)
        {
            Bar = bar;
            Baz = baz;
        }
    
        public int Bar { get; set; }
        public string Baz { get; set; }
    }
    

    您可以通过这种方式创建其公共实例属性和值的字典:

    var valuesByProperty = foo.GetType().
         GetProperties(BindingFlags.Public | BindingFlags.Instance).
         ToDictionary(p => p, p => p.GetValue(foo));
    

    如果您想包含更多或不同的结果,请在GetProperties 方法中指定不同的BindingFlags。如果这不能回答您的问题,请发表评论。

    或者,假设您使用的是动态对象和匿名类型,方法类似。显然,以下示例不需要类 Foo

    dynamic foo = new {Bar = 42, Baz = "baz"};
    Type fooType = foo.GetType();
    var valuesByProperty = fooType.
        GetProperties(BindingFlags.Public | BindingFlags.Instance).
        ToDictionary(p => p, p => p.GetValue(foo));
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2021-10-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-07-05
      • 1970-01-01
      相关资源
      最近更新 更多