Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/329.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何将ExpandooObject映射到类型?_C#_.net_Entity Framework_Json.net - Fatal编程技术网

C# 如何将ExpandooObject映射到类型?

C# 如何将ExpandooObject映射到类型?,c#,.net,entity-framework,json.net,C#,.net,Entity Framework,Json.net,我有一个带有以下键值对的动态ExpandoObject结果: { id: "1" } { product_name: "some name" } { product_category: "some category" } 我有一门课: public class Product { [JsonProperty("id")] public string Id { get; set; } [JsonProperty("productName")] publi

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

您可以创建如下帮助器方法:

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);
public static T FromExpando(ExpandoObject expando),其中T:class,new()
{
if(expando==null)返回null;
变量属性=类型(T)
.GetProperties()
.Where(pi=>pi.CanWrite&!pi.GetIndexParameters().Any())
.ToDictionary(pi=>pi.Name.ToLower());
T obj=新的T();
foreach(expando中的var kvp)
{
var name=kvp.Key.ToLower();
var val=kvp.值;
如果(val!=null&&
properties.TryGetValue(name,out PropertyInfo prop)&&
prop.PropertyType.IsAssignableFrom(val.GetType())
{
属性设置值(对象、值);
}
}
返回obj;
}
那么就这样称呼它:

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);
prod=FromExpando(expando);

Fiddle:

当您使用这样的JSON时,您使用expando有什么原因吗?它看起来甚至不像是有效的JSON。在我看来,这些都是单独的对象,每个对象都有一个属性。它映射到
IDictionary
。也许您喜欢ToDictionary()扩展方法。但实际上,您是说您不想使用ExpandoObject。大量的ORM库,给实体框架一个旋转。