从第三方程序中,我得到一个结果列表,如下所示:
+--------+-----------+-------------+
+ Name + Property + Prop. value +
+--------+-----------+-------------+
+ foo + prop1 + value1 +
+--------+-----------+-------------+
+ foo + prop2 + value2 +
+--------+-----------+-------------+
有十几个属性,每个属性可能存在也可能不存在。
目的是从这些创建.NET对象。
现在,我使用LINQ来填充对象(抱歉,VB,但它非常简单):
New myClass With {
.myprop1 = (From o In query.rows where o.name = 'foo' and o.col(1) = 'prop1' select o.col(2)).FirstOrDefault
...
.myprop12 = (From o In query.rows where o.name = 'foo' and o.col(1) = 'prop12' select o.col(2)).FirstOrDefault
所以我基本上有相同的代码行12次。我想简化它。
我想到的是Dictionary(Property, String)
,我可以在其中定义
myprop1 <-> prop1
....
myprop12 <-> prop12
然后循环这个。 我还没想出怎么做。这可能吗?有没有其他方法可以减少这种分类的繁琐?
答案 0 :(得分:0)
很抱歉,但是我将不得不在C#中做这个...(我没有测试过这个,但它应该关闭..)
myClass foo = new myClass();
var fields = from o in query.rows
where o.name == "foo"
select new {Property=o.col(1), Value = o.col(2) };
foreach(var prop in foo.GetType().GetProperties())
{
var fld = fields.FirstOrDefault(f=>f.Property == prop.Name);
if (fld != null)
prop.SetValue(foo, fld.Value);
}
注意,这假设属性名称myClass
与字段名称相同,显然不是这种情况。映射最好由字典处理,您可能需要手动创建它:
var FieldByProperty = new Dictionary<string, string>();
FieldByProperty .Add["myprop1", "prop1");
FieldByProperty .Add["myprop2", "prop2");
// :
foreach(var prop in foo.GetType().GetProperties())
{
var fldName = FieldByProperty[prop.Name];
var fld = fields.FirstOrDefault(f=>f.Property == fldName);
if (fld != null)
prop.SetValue(foo, fld.Value);
}