我的实体框架实体和我序列化/反序列化的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 :(得分: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]);
}
}