C# 如何将ExpandooObject映射到类型?
我有一个带有以下键值对的动态ExpandoObject结果: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
{ 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库,给实体框架一个旋转。