如何将ExpandoObject映射到类型?

我有一个动态的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属性来自数据库列。)

gechenlei 回答:如何将ExpandoObject映射到类型?

您可以制作如下的帮助方法:

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

本文链接:https://www.f2er.com/3137990.html

大家都在问