2012-10-22 159 views
4

我在我的实体框架实体和为了导入和导出到文本文件而序列化/反序列化的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?????? 
    } 
} 

如何获得匹配的特性为我做了接收新创建的实体信息。我真的很想避免一个大的开关语句。

我的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>(); 

    } 
} 
+0

我觉得有一些相关的代码所缺少这里那些在外面的人正在寻找一个你正在序列化/反序列化到什么实体的好图片。在'???????这里有什么??????'是你试图反序列化到你序列化的同一类型?如果没有,有没有地图字典有人说这些属性映射到这些?也许它是一种不同的类型,但属性完全匹配。 –

+0

@BigM,我原来在我复制到这里的代码中犯了一个错误。是的,假设我正在尝试反序列化到我在上面的代码中序列化为同一个实体。在这个例子中,他们都是'FixedLengthBlock'。 'block'是JsonEntity,所以如果EF实体属性匹配JsonEntity中的键,我希望该字典键对的值插入到相应的EF属性中。 – Scottingham

回答

2

好了,所以如果我们要反序列化到同一类型,让我们试试这个:

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

非常好!我只需要添加一个null参数,如下所示:propertyInfo.SetValue(newObj,block.Properties [property.Name],null); – Scottingham

+0

@Scottingham,很高兴我能帮上忙! –