具有属性名称和值的映射对象

本文关键字:映射 对象 属性 | 更新日期: 2023-09-27 18:06:32

我有class

public class Foo 
{
    public string Id { get; set; }
    public string Name { get; set; }
    public string Email { get; set; }    
}

我想将对象转换为泛型对象

{
    "properties": {
        "id" : "1234",
        "name": "John Doe",
        "email" : "john.doe@mail.com"
    }
}

我想将类实例转换为结构,其中属性将根据类动态变化。这在Automapper中是否可行?

具有属性名称和值的映射对象

似乎您想要序列化/反序列化到/从JSON。在这种情况下,您可以引用Newtonsoft。Json,并使用不依赖于任何特定类的JsonConvert.SerializeObject/JsonConvert.DeserializeObject泛型方法:

反序列化(从字符串到类实例):

var foo = JsonConvert.DeserializeObject<Foo>(jsonString);

序列化(从类实例到字符串):

var stringValue = JsonConvert.SerializeObject(foo)

One More Point (Mapping)

你也可能想用一些属性来装饰你的类来指定映射:

[DataContract]
public class Foo 
{
    [DataMember(Name = "id")]
    public string Id {get;set;}
    [DataMember(Name = "name")]
    public string Name {get;set;}
    [DataMember(Name = "email")]
    public string Email {get;set;}    
}

部分 AutoMapper不能映射到dictionary或ExpandoObject,所以不能。

在我意识到通过映射到ExpandoObject Automapper将简单地留给您一个空对象之前,发布了以下解决方案。

我认为最简单的解决方案是这样的(假设你想要一个ExpandoObject作为结果):

public ExpandoObject Map<TInput>(TInput inputObject)
{
  dynamic result = new ExpandoObject();
  result.properties = Mapper.DynamicMap<TInput, ExpandoObject>(inputObject);
  return (ExpandoObject)result;
}

据我所知,你不能使用automapper将所有成员作为子属性委托给另一个字段,但是自己做这件事很简单。 AutoMapper在这里完全没用。

编辑:似乎automapper与ExpandoObject斗争…实际上,看起来AutoMapper根本无法做到这一点,所以你只能使用反射。

然后编写一个反射对象,该对象可以用对象的属性创建或填充字典。