【问题标题】:How to map an ExpandoObject to a type?如何将 ExpandoObject 映射到类型?
【发布时间】:2019-11-08 22:43:53
【问题描述】:

我有一个包含以下键值对的动态 ExpandoObject 结果:

 { id: "1" }
 { product_name: "some name" }
 { product_category: "some category" }

我有一堂课:

public class Product 
{
    [JsonProperty("id")]
    public string Id { get; set; }

    [JsonProperty("productName")]
    public string ProductName { get; set; }

    [JsonProperty("productCategory")]
    public string ProductCategory { get; set; }
}

那么我可以将 ExpandoObject 作为新对象映射到此类吗? (ExpandoObject 属性来自数据库列。)

【问题讨论】:

  • 当您拥有这样的 JSON 时,您是否有理由使用 expando?
  • 看起来甚至不像是有效的 JSON。在我看来,这些都是独立的对象,每个对象都有一个属性。
  • 它映射到IDictionary<string, object>。也许你喜欢 ToDictionary() 扩展方法。但实际上,您是在说您不想使用 ExpandoObject。周围有很多 ORM 库,给实体框架一个旋转。

标签: c# .net entity-framework json.net


【解决方案1】:

你可以像这样创建一个辅助方法:

public static T FromExpando<T>(ExpandoObject expando) where T : class, new()
{
    if (expando == null) return null;

    var properties = typeof(T)
        .GetProperties()
        .Where(pi => pi.CanWrite && !pi.GetIndexParameters().Any())
        .ToDictionary(pi => pi.Name.ToLower());

    T obj = new T();
    foreach (var kvp in expando)
    {
        var name = kvp.Key.ToLower().Replace("_", "");
        var val = kvp.Value;
        if (val != null &&
            properties.TryGetValue(name, out PropertyInfo prop) &&
            prop.PropertyType.IsAssignableFrom(val.GetType()))
        {
            prop.SetValue(obj, val);
        }
    }
    return obj;
}

然后这样称呼它:

Product prod = FromExpando<Product>(expando);

小提琴:https://dotnetfiddle.net/TUgaW5

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-10-31
    • 2018-06-19
    • 1970-01-01
    • 1970-01-01
    • 2020-05-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多