3

データをディクショナリ形式で受け取っており、それを動的オブジェクトにデシリアライズしたいと考えています。ツイストは、辞書のキーが階層オブジェクトを表現することです。2 番目のひねりは、キーの一部が配列や辞書のプロパティを表現することです。

例えば:

===========Key================ ======Value========
Person.First                  | John
Person.Last                   | Doe
Person.Phone[Work]            | 999-555-1234
Person.Phone[Home]            | 999-555-1235
Person.Addresses[Home].Street | 101 My Street
Person.Addresses[Home].City   | AnyTown
Person.Spouse.First           | Jane
Person.Spouse.Last            | Doe
Person.Insurance[0].Name      | Medicare
Person.Insurance[0].GroupNum  | 1234567

編集:配列の例を追加

ランタイム式エバリュエーターで使用できるオブジェクトを作成する簡単な方法を見つけようとしています。

これは、単純なプロパティで機能する最初の試みですが、配列を処理しようとはしません

public static class DynamicBuilder
{
    public static object Build(IDictionary<string, object> dict)
    {

        ExpandoObject root = new ExpandoObject();

        foreach (var item in dict)
        {
            var objDict = (IDictionary<string, object>)root;

            var parts = item.Key.Split('.');

            for (int i = 0; i < parts.Length ; i++)
            {
                string propName = parts[i];

                if (i < parts.Length - 1)
                {
                    if (!objDict.ContainsKey(propName))
                    {
                        dynamic temp = new ExpandoObject();
                        objDict.Add(propName, temp);
                        objDict = (IDictionary<string, object>)temp;
                    }
                    else
                    {
                        objDict = (IDictionary<string, object>)objDict[propName];
                    }

                }
                else
                {
                    if (objDict.ContainsKey(propName))
                        objDict[propName] = item.Value;
                    else
                        objDict.Add(propName, item.Value);

                }

            }

        }

        return root;
    }

}

これにアプローチするためのより良い方法についてのアイデアはありますか?

ありがとう、

4

1 に答える 1

0

簡単な方法は、次のようなカスタム オブジェクトを作成することです。

public class DictObject
{
   public String value;
   public Dictionary<string, DictObject> children;
}

メイン辞書は単なるDictionary<string, DictObject>オブジェクトになります。プロパティ名ごとに、ディクショナリ エントリと値、または子の子ディクショナリを追加します。

Person.Firstしたがって、次のようにアクセスできるようにロードします

 MainDict("Person").children("First").Value 

.そして、そのアプローチを使用すると、ディクショナリと配列のエントリを特別に扱うのではなく、子と同じように簡単に表すことができます。このようにデータを視覚化し、

===========Key================ ======Value========
Person.First                  | John
Person.Last                   | Doe
Person.Phone.Work             | 999-555-1234
Person.Phone.Home             | 999-555-1235
Person.Addresses.Home.Street  | 101 My Street
Person.Addresses.Home.City    | AnyTown
Person.Spouse.First           | Jane
Person.Spouse.Last            | Doe
Person.Insurance.0.Name       | Medicare
Person.Insurance.0.GroupNum   | 1234567

したがって、値は次のようにアクセスされます。

 MainDict("Person").children("Insurance").children("0").children("Name").Value 

DictObjectまた、同じテキスト ファイルを再度出力したい場合に辞書/配列を追跡する場合は、いつでも にプロパティを追加できます。

于 2012-05-17T16:13:56.307 に答える