可以在.NET中的Dictionary中使用属性

时间:2017-06-07 13:51:06

标签: .net vb.net linq

从第三方程序中,我得到一个结果列表,如下所示:

+--------+-----------+-------------+
+  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

然后循环这个。 我还没想出怎么做。这可能吗?有没有其他方法可以减少这种分类的繁琐?

1 个答案:

答案 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);
}