【问题标题】:PropertyInfo.SetValue Object does not match target typePropertyInfo.SetValue 对象与目标类型不匹配
【发布时间】:2012-01-30 03:57:19
【问题描述】:

我有一个与this one 类似的错误,但不幸的是不是同样简单的解决方案。代码如下:

public virtual void MapObject(T obj, IViewModel<T> viewModel, ITPSDataAccess dataAccess)
{
    var objProps = obj.GetType().GetProperties();
    var dtoProps = viewModel.GetType().GetProperties();
    foreach (var dtoProp in dtoProps)
    {
        var objProp = dtoProps.SingleOrDefault(x => x.Name == dtoProp.Name);
        if (objProp != null)
        {
            var dtoVal = dtoProp.GetValue(viewModel, null);
            objProp.SetValue(obj, dtoVal, null); // ERROR HERE
        }
    }
     ...
}

错误发生在指示点,指出“对象与目标类型不匹配”。看起来我正在传递要设置的正确对象 - 因此我无法解决问题。

我还尝试接受this solution 的建议,并检查我尝试设置的引发异常的属性类型 - 有问题的属性是一个字符串,而 setter 似乎不是坏了,因为它在正常、非反射的情况下工作。

【问题讨论】:

  • objProp.PropertyTypedtoVal.GetType() 添加到Watch 调试器窗口,并在调用objProp.SetValue(...) 时设置断点。当断点被命中时,这两个表达式的计算结果是什么?它们必须相同。

标签: c# reflection


【解决方案1】:

错误似乎在这里:

var objProp = dtoProps.SingleOrDefault(x => x.Name == dtoProp.Name);

我想你的意思是:

var objProp = objProps.SingleOrDefault(x => x.Name == dtoProp.Name); 

【讨论】:

  • 谢谢,伙计 - 那是你盯着 30 分钟看的那些之一,其他人需要 3 秒才能看到它......!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-02-04
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多