我有一个现有的c#应用程序来修改并需要循环一个具有未知属性的对象,并且有一半用反射来解决问题。
我尝试使用属性名称和属性值填充字典。代码如下,我已经在***之间描述了我需要的内容
这是一个MVC5项目
private Dictionary<string, string> StoreUserDetails ()
{
var userDetails = new Dictionary<string, string>();
foreach (var userItem in UserItems)
{
var theType = userItem.GetType();
var theProperties = theType.GetProperties();
foreach (var property in theProperties)
{
userDetails.Add(property.Name, ***value of userItem property with this property name***);
}
}
return userDetails;
}
非常感谢您的帮助。
答案 0 :(得分:2)
您正在寻找的是PropertyInfo.GetValue()
方法:
https://msdn.microsoft.com/en-us/library/b05d59ty%28v=vs.110%29.aspx
示例强>
property.GetValue(userItem, null);
<强>语法强>
public virtual Object GetValue(
Object obj,
Object[] index
)
<强>参数强>
obj
输入:System.Object
将返回其属性值的对象。
index
输入:System.Object[]
索引属性的可选索引值。索引属性的索引从零开始。对于非索引属性,此值应为 null 。
返回值
输入:System.Object
指定对象的属性值。
答案 1 :(得分:2)
试试这个
foreach (var property in theProperties)
{
var userItemVal = property.GetValue(userItem, null);
userDetails.Add(property.Name, userItemVal.ToString());
}
答案 2 :(得分:0)
这就是你如何做到的。 (顺便说一下,你的代码可能会错误地输出&#34;字典键不是唯一的&#34;因为第二个userItem会尝试将相同的属性名称添加到字典中。你可能需要List<KeyValuePair<string, string>>
)< / p>
foreach (var property in theProperties)
{
// gets the value of the property for the instance.
// be careful of null values.
var value = property.GetValue(userItem);
userDetails.Add(property.Name, value == null ? null : value.ToString());
}
顺便说一句,如果您在MVC上下文中,可以参考System.Web.Routing并使用以下代码段。
foreach (var userItem in UserItems)
{
// RVD is provided by routing framework and it gives a dictionary
// of the object property names and values, without us doing
// anything funky.
var userItemDictionary= new RouteValueDictionary(userItem);
}