C# 基于图元属性列表设置单个图元属性

C# 基于图元属性列表设置单个图元属性,c#,json,entity-framework,entity-framework-4,json.net,C#,Json,Entity Framework,Entity Framework 4,Json.net,我在实体框架实体和JSON对象之间有一个中介对象,为了导入和导出到文本文件,我对其进行了序列化/反序列化 当我从实体框架导出时,我使用以下代码迭代实体类型属性……如果实体中的属性与我拥有的枚举中的属性匹配,则该属性将保存到JSON对象。这可以防止特定于实体的属性弄乱我的JSON var blockProperties = typeof(FixedLengthBlock).GetProperties(BindingFlags.Public | BindingFlags.Instance); for

我在实体框架实体和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??????
   }
}
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>();

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

我的Json对象如下所示:

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

    }
}
公共类JsonEntity
{
公共字符串名称{get;set;}
公共字符串类型{get;set;}
公共字典属性{get;set;}
公共列表子实体{get;set;}
公共JSONENITY()
{
属性=新字典();
}
}

好的,如果我们要反序列化为同一类型,那么让我们试试这个:

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

我认为这里缺少一些相关的代码,让那些旁观者能够很好地了解您正在序列化/反序列化的实体。在
???这里是什么?
部分中,您是否尝试反序列化为从中序列化的相同类型?如果没有,是否有地图字典,说这些属性映射到这些属性?可能是另一种类型,但属性完全匹配。@BigM,我最初在复制到这里的代码中犯了一个错误。是的,假设我正试图反序列化到我在上面代码中序列化到的同一个实体中。在本例中,它们都是“FixedLengthBlock”block'是一个JsonEntity,因此如果EF实体属性与JsonEntity中的键匹配,我希望将该字典键对的值插入到相应的EF属性中。非常好!我唯一需要添加的是一个空参数,如:propertyInfo.SetValue(newObj,block.Properties[property.Name],null)@Scottingham,很高兴我能帮上忙!