我有以下方法返回一个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与目标类型不匹配。
答案 0 :(得分:2)
这里有两件事:
this
,而不是objeto
,这意味着您正在尝试从错误的对象中读取属性。尝试将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中的属性之外的其他内容,并且您还引用了类变量,它们也不是属性。这些属性实际上是您想要的,而不是应用于类定义的“字段”或属性?