web-dev-qa-db-ja.com

expandoオブジェクトの値を取得する方法#

まず、txtファイルをフォルダーに読み込み、その後、expandoオブジェクトでオブジェクトをハイドレートしました。

しかし、私はこのオブジェクトからいくつかの値を取得して、リストビュー(winforms)を埋めたいと思います。

private void Form1_Load(object sender, EventArgs e)
{                  
    string pattern = "FAC*.txt";
    var directory = new DirectoryInfo(@"C:\\TestLoadFiles");
    var myFile = (from f in directory.GetFiles(pattern)
                  orderby f.LastWriteTime descending
                  select f).First();

    hydrate_object_from_metadata("FAC",listBox3);
    hydrate_object_from_metadata("BL", listBox4);

    this.listBox3.MouseDoubleClick += new MouseEventHandler(listBox3_MouseDoubleClick);
    this.listBox1.MouseClick += new MouseEventHandler(listBox1_MouseClick);
}

void hydrate_object_from_metadata(string tag, ListBox listBox)
{
    SearchAndPopulateTiers(@"C:\TestLoadFiles", tag + "*.txt", tag);
    int count = typeDoc.Count(D => D.Key.StartsWith(tag));

    for (int i = 0; i < count; i++)
    {
        object ob = GetObject(tag + i);
        ///HERE I WOULD LIKE GET DATA VALUE FROM ob object
    }
}

Object GetObject(string foo)
{
    if (typeDoc.ContainsKey(foo))
        return typeDoc[foo];
    return null;
}

void SearchAndPopulateTiers(string path, string extention, string tag)
{
    DirectoryInfo di = new DirectoryInfo(path);
    FileInfo[] files = di.GetFiles(extention);

    int i = 0;
    foreach (FileInfo file in files)
    {
        var x = new ExpandoObject() as IDictionary<string, Object>;

        string[] strArray;
        string s = "";

        while ((s = sr.ReadLine()) != null)
        {
            strArray = s.Split('=');

            x.Add(strArray[0],strArray[1]);

        }

        typeDoc.Add(tag+i,x);
        i++;
    }
}

では、expandoオブジェクトの値を取得することは可能ですか?

8
Bissap
_var eo = new ExpandoObject();
object value = null;
_

方法1:動的

_dynamic eod = eo;

value = eod.Foo;
_

方法#2:IDictionary

_var eoAsDict = ((IDictionary<String, Object>)eo);

if (eoAsDict.TryGetValue("Foo", out value))
{
    //  Stuff
}

foreach (var kvp in eoAsDict)
{
    Console.WriteLine("Property {0} equals {1}", kvp.Key, kvp.Value);
}
_

typeDocが何であるかは言いません(別のExpandoObject?)ですが、xを入れている場合、xExpandoObject、あなたはxを取り消すことができます。 xがループ内の_IDictionary<String, Object>_への参照として型指定されているという事実はここにもありません。 GetObject()objectを返すかどうかも関係ありません。型指定された参照objectは、何でも参照できます。 GetObject()が返すもののタイプは、参照されるのではなく、実際に返されるものに固有です。

したがって:

_dynamic ob = GetObject(tag + i);
_

または

_var ob = GetObject(tag + i) as IDictionary<String, Object>;
_

...プロパティに_ob.Foo_または_ob["Foo"]_のどちらでアクセスするかによって異なります。