获得会员'名称和价值

时间:2013-08-17 14:48:41

标签: c# reflection

我有以下方法返回一个Dictionary<string, string>,其中包含对象的所有公共成员(字段和属性)的名称作为字典键。我可以得到成员的名字,但我无法得到他们的价值观。谁能告诉我如何通过以下方法实现这一目标:

 public Dictionary<String, String> ObjectProperty(object objeto)
 {
    Dictionary<String, String> dictionary = new Dictionary<String, String>();

    Type type = objeto.GetType();
    FieldInfo[] field = type.GetFields();
    PropertyInfo[] myPropertyInfo = type.GetProperties();

    String value = null;

    foreach (var propertyInfo in myPropertyInfo)
    {
        value = (string)propertyInfo.GetValue(this, null); //Here is the error
        dictionary.Add(propertyInfo.Name.ToString(), value);
    }

    return dictionary;
}

错误:

对象与目标类型不匹配。 描述:执行当前Web请求期间发生未处理的异常。请查看堆栈跟踪,以获取有关错误及其在代码中的起源位置的更多信息。

异常详细信息:System.Reflection.TargetException:Object与目标类型不匹配。

2 个答案:

答案 0 :(得分:2)

这里有两件事:

  1. 您传递的是this,而不是objeto,这意味着您正在尝试从错误的对象中读取属性。
  2. 您无法确保只是尝试阅读不是索引器的属性。
  3. 尝试将foreach更改为:

    foreach (var propertyInfo in myPropertyInfo)
    {
        if (propertyInfo.GetIndexParameters().Length == 0)
        {
            value = (string) propertyInfo.GetValue(objeto, null);
            dictionary.Add(propertyInfo.Name.ToString(), value);
        }
    }
    

答案 1 :(得分:1)

注意,这里:

foreach (var propertyInfo in myPropertyInfo)
{
    value = (string) propertyInfo.GetValue(this, null); //Here is the error
    dictionary.Add(propertyInfo.Name.ToString(), value);

}

您假设所有属性都是字符串。是吗?

如果不是,但无论如何你想要字符串,你可以使用这段代码:

 object objValue = propertyInfo.GetValue(objeto, null);     
 value = (objValue == null) ? null : objValue.ToString();

上述代码还考虑了属性值可能为null。我没有考虑索引属性的可能性,但如果你有,你需要适应它们。

另外,正如Lasse V. Karlsen指出的那样,通过传递this而不是objeto,您试图从方法的父类中提取属性值,而不是objeto 。如果它们不是同一个对象,您将无法获得所需的结果;如果它们甚至不是对象的 type ,那么你会收到错误。

最后,您使用了术语“属性”,它指的是除.NET中的属性之外的其他内容,并且您还引用了类变量,它们也不是属性。这些属性实际上是您想要的,而不是应用于类定义的“字段”或属性?