首先我将txt文件读入文件夹,然后用expando Object水合对象。
但现在我想从这些对象中获取一些值来填充listview(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 :(得分:10)
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
,x
是{ {1}},您可以将ExpandoObject
退出,它仍然是一个。 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
来访问这些属性。
答案 1 :(得分:0)
我一般/动态地执行此操作,因此无法选择在代码中包含实际字段名称,并最终以这种方式进行了操作:
eo.Where(v => v.Key == keyNameVariable).Select(x => x.Value).FirstOrDefault();
可能是一种更好的方法,但是它可行。