2017-04-21 9 views
3

最初に、txtファイルをフォルダに読み込み、exp​​andoオブジェクトでオブジェクトを水和させた後に、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オブジェクトに値を渡すことは可能ですか?

+0

"ob"の後ろにプロパティの名前を入れてみましたか?すなわち、var firstName = ob.FirstName;明らかに知覚は得られません。 –

+0

@ JohnMcこれは、 'ExpandoObject'ではなく、オブジェクトである' ob'では動作しません。 – mason

+0

@masonはい、あなたは絶対に正しいです –

答えて

5
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); 
} 

あなたは(?それは別のExpandoObjectある)typeDocが何であるかを言うが、あなたの場合はありませんそれにxを入れて、xExpandoObjectであれば、xを取り戻すことができます。それでも1になります。そのループ内にIDictionary<String, Object>への参照としてxが入力されているという事実はここにもそこにありません。 GetObject()objectを返すかどうかは関係ありません。参照型のobjectは何かを参照することができます。 GetObject()の返品の種類は、返品された実際のものに固有のものであり、実際の返品には関係しません。したがって

dynamic ob = GetObject(tag + i); 

または

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

...あなたは ob.Fooob["Foo"]としてプロパティにアクセスすることを好むだろうかどうかに応じて。

+0

'private Dictionary typeDoc = 新しい辞書();'私はxオブジェクトを分離するためにこれを使いました。 – Bissap

+0

@Bissapありがとうございます。 'typeDoc'を' ExpandoObjects'に入れているのであれば、 'Dictionary 'に変更することを考えます。 –

+0

'var ob = GetObject(tag + i)をIDictionary ;' nice for me! – Bissap

関連する問題