【问题标题】:Setting individual entity properties based on list of entity properties根据实体属性列表设置单个实体属性
【发布时间】:2012-10-22 18:20:45
【问题描述】:

我的 Entity Framework 实体和我序列化/反序列化的 JSON 对象之间有一个中间对象,以便导入和导出到文本文件。

当我从实体框架导出时,我使用以下代码遍历实体类型属性...如果实体中的属性与我拥有的枚举中的属性匹配,则该属性将保存到 JSON 对象.这可以防止实体特定属性弄乱我的 JSON。

var blockProperties = typeof(FixedLengthBlock).GetProperties(BindingFlags.Public | BindingFlags.Instance);
foreach (var property in blockProperties)
{

    if (Enum.GetNames(typeof(ModuleSettingEnum)).Contains(property.Name.ToLower()) && property.GetValue((FixedLengthBlock)element, null) != null)
        blockJsonEntity.Properties.Add(property.Name, property.GetValue((FixedLengthBlock)element, null).ToString());
}

虽然上面的代码有效,但我想不出类似的方法来做相反的事情。从 JSON 中读取时,我在字典中有属性/值。我知道我可以遍历 EF 实体的属性并搜索字典是否包含这样的键:

var blockProperties = typeof(FixedLengthBlock).GetProperties(BindingFlags.Public | BindingFlags.Instance);
foreach (var property in blockProperties)
{
        if (block.Properties.ContainsKey(property.Name))
   {
     ???????What goes here??????
   }
}

如何将匹配的属性放入我为接收信息而创建的新实体中。我真的很想避免使用大的 switch 语句。

我的 Json 对象如下所示:

public class JsonEntity
{
    public string Name { get; set; }
    public string Type { get; set; }
    public Dictionary<string, string> Properties { get; set; }
    public List<JsonEntity> SubEntities { get; set; } 

    public JsonEntity()
    {
        Properties = new Dictionary<string, string>();

    }
}

【问题讨论】:

  • 我认为这里缺少一些相关代码,供外部人员查看以更好地了解您正在序列化/反序列化到哪个实体。在???????What goes here?????? 部分中,您是否尝试反序列化为与序列化相同的类型?如果没有,是否有地图字典有人说这些属性映射到这些?也许它是一种不同的类型,但属性完全匹配。
  • @BigM,我最初在复制到这里的代码中犯了一个错误。是的,假设我正在尝试反序列化为我在上面的代码中序列化的同一实体。在此示例中,它们都是“FixedLengthBlock”。 'block' 是一个 JsonEntity,因此如果 EF 实体属性与 JsonEntity 中的键匹配,我希望将该字典键对的值插入到相应的 EF 属性中。

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


【解决方案1】:

好的,所以如果我们要反序列化为相同的类型,让我们试试这个:

var bindingFlags = BindingFlags.Public | BindingFlags.Instance;
var blockProperties = typeof(FixedLengthBlock).GetProperties(bindingFlags);
var newObj = Activator.CreateInstance(typeof(FixedLengthBlock))
foreach (var property in blockProperties)
{
    if (block.Properties.ContainsKey(property.Name))
    {
        var propertyInfo = newObj.GetType().GetProperty(property.Name, bindingFlags);
        if (propertyInfo == null) { continue; }
        propertyInfo.SetValue(newObj, block.Properties[property.Name]);
    }
}

【讨论】:

  • 太棒了!我唯一需要添加的是一个空参数,如下所示:propertyInfo.SetValue(newObj, block.Properties[property.Name], null);
  • @Scottingham,很高兴我能提供帮助!
猜你喜欢
  • 1970-01-01
  • 2012-07-31
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-02-25
  • 2018-05-20
相关资源
最近更新 更多