如何获得未知属性的值(部分已经用反射解决)

时间:2015-06-03 17:01:37

标签: c# reflection properties

我有一个现有的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;
    }

非常感谢您的帮助。

3 个答案:

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