Как сопоставить ExpandoObject с типом? - PullRequest
0 голосов
/ 08 ноября 2019

У меня есть динамический результат 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 берутся из столбцов базы данных.)

1 Ответ

0 голосов
/ 08 ноября 2019

Вы можете создать вспомогательный метод следующим образом:

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

Fiddle: https://dotnetfiddle.net/TUgaW5

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...