关键点:如何将Dictionary<String, String>
映射到ViewModel? ViewModel包含与Dictionary键相同名称的属性。
为了提供更多信息,程序将读取数据库记录并返回Dictionary<String, String>
中记录的所有值。我只想向用户显示20-30个这些字段,而其他处理在其他字段的幕后发生。我制作了一个ViewModel并强烈输入了视图。我可以手动将Dictionary<String, String>
中的属性分配给ViewModel属性,但这似乎是填充ViewModel的错误方法。
然后我尝试使用反射来填充字段,但这似乎是错误的方法。
foreach (PropertyInfo propertyInfo in this.GetType().GetProperties())
{
if (propertyInfo.PropertyType.Name.Equals("String"))
{
if (myClass.FieldValues.Keys.Contains(propertyInfo.Name))
{
propertyInfo.SetValue(this, myClass.FieldValues[propertyInfo.Name], null);
}
}
}
那么,有没有一种方法可以使用Dictionary<String, String>
填充我的ViewModel,其中Key值与ViewModel属性值的名称相同?
答案 0 :(得分:1)
如果我是,我正在考虑设置一个ORM层(实体,Linq-to-Sql)来返回强类型对象。这为您提供了更安全的整体解决方案。
如果您遇到Dictionary<string,string>
,那么您有三种选择:
反思 - 你已经做到了,这很直接。
表达式/反射。您可以编译一个转换为lambda的表达式,然后简单地将其作为方法调用。这有利于在运行时比反射更快。但是,除非您每秒进行数千次这样的操作,否则获得的性能不值得付出额外的努力。
dynamic
/ ExpandoObject
。这有点实验性,并且涉及围绕动态对象的强类型包装。
public class ViewModel {
ExpandoObject m_Dynamic;
public string FirstName {return m_Dynamic.FirstName ; }
public string LastName {return m_Dynamic.LastName; }
public ExpandoObject DynamicObject {get{return m_Dynamic;}}
}
// In the data mapping layer
ViewModel vm = new ViewModel();
Dictionary<string,string> data = new Dictionary<string,string>{{"FirstName", "Igor"}, {"LastName", "Zevaka"}};
foreach(var kv in data) {
((IDictionary<string,object>)vm.DynamicObject)[kv.Key] = kv.Value;
}
哎呀,你甚至不能打扰dynamic
并让财产直接进入字典:
public class ViewModel {
Dictionary<string,string> m_Dynamic;
public string FirstName {return m_Dynamic["FirstName"]; }
public string LastName {return m_Dynamic["LastName"]; }
public Dictionary<string,string> DynamicObject {get {return m_Dynamic;}}
}
// In the data mapping layer
ViewModel vm = new ViewModel();
Dictionary<string,string> data = new Dictionary<string,string>{{"FirstName", "Igor"}, {"LastName", "Zevaka"}};
foreach(var kv in data) {
vm.DynamicObject[kv.Key] = kv.Value;
}