31

我正在尝试使用该propertyInfo.SetValue()方法通过反射设置对象属性值,并且出现异常“对象与目标类型不匹配”。这真的没有意义(至少对我来说!),因为我只是想在一个带有字符串替换值的对象上设置一个简单的字符串属性。这是一个代码片段 - 它包含在一个递归函数中,因此还有更多代码,但这是胆量:

PropertyInfo fieldPropertyInfo = businessObject.GetType().GetProperties().FirstOrDefault(f => f.Name.ToLower() == piecesLeft[0].ToLower());
businessObject = fieldPropertyInfo.GetValue(businessObject, null);

fieldPropertyInfo.SetValue(businessObject, replacementValue, null);

我已经通过比较验证了businessObject" andreplacementValue` 是相同的类型,结果返回 true:

businessObject.GetType() == replacementValue.GetType()
4

3 回答 3

33

您正在尝试设置 propertyinfo 值的值。因为你正在覆盖businessObject

PropertyInfo fieldPropertyInfo = businessObject.GetType().GetProperties()
                                 .FirstOrDefault(f => f.Name.ToLower() == piecesLeft[0].ToLower());

// The result should be stored into another variable here:
businessObject = fieldPropertyInfo.GetValue(businessObject, null);

fieldPropertyInfo.SetValue(businessObject, replacementValue, null);

它应该是这样的:

PropertyInfo fieldPropertyInfo = businessObject.GetType().GetProperties()
                                 .FirstOrDefault(f => f.Name.ToLower() == piecesLeft[0].ToLower());

// also you should check if the propertyInfo is assigned, because the 
// given property looks like a variable.
if(fieldPropertyInfo == null)
    throw new Exception(string.Format("Property {0} not found", f.Name.ToLower()));

// you are overwriting the original businessObject
var businessObjectPropValue = fieldPropertyInfo.GetValue(businessObject, null);

fieldPropertyInfo.SetValue(businessObject, replacementValue, null);
于 2013-09-30T18:34:21.713 回答
7

我怀疑你只是想删除第二行。它到底在那儿做什么?您正在-引用的对象中获取属性的值,businessObject并将其设置为businessObject. 因此,如果这确实是一个字符串属性,那么之后的值businessObject将是一个字符串引用 - 然后您尝试将其用作设置属性的目标!这有点像这样做:

dynamic businessObject = ...;
businessObject = businessObject.SomeProperty; // This returns a string, remember!
businessObject.SomeProperty = replacementValue;

那是行不通的。

目前尚不清楚是什么replacementValue- 无论是替换字符串还是从中获取真正替换值的业务对象,但我怀疑您要么想要:

PropertyInfo fieldPropertyInfo = businessObject.GetType().GetProperties()
      .FirstOrDefault(f => f.Name.ToLower() == piecesLeft[0].ToLower());
fieldPropertyInfo.SetValue(businessObject, replacementValue, null);

或者:

PropertyInfo fieldPropertyInfo = businessObject.GetType().GetProperties()
      .FirstOrDefault(f => f.Name.ToLower() == piecesLeft[0].ToLower());
object newValue = fieldPropertyInfo.GetValue(replacementValue, null);
fieldPropertyInfo.SetValue(businessObject, newValue, null);
于 2013-09-30T18:32:34.270 回答
6

您正在尝试将businessObject 上的属性值设置为 of 类型的另一个值,而businessObject不是该属性的类型。

要使此代码正常工作,replacementValue需要与 定义的字段的类型相同piecesLeft[0],并且显然不是那种类型。

于 2013-09-30T18:31:28.403 回答