4

テキスト ファイルにインポートおよびエクスポートするためにシリアライズ/デシリアライズする 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>();

    }
}
4

1 に答える 1

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]);
    }
}
于 2012-10-22T19:04:10.530 に答える