属性信息.SetValue对象无法匹配目标类型

3

我遇到了一个类似于这个的错误,但不幸的是没有同样简单的解决方案。这里是代码:

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
        }
    }
     ...
}

该错误发生在指定的位置,提示“对象类型不匹配”。看起来我传递了正确的要设置的对象,因此无法解决问题。
我还尝试了这个解决方案提供的建议,并检查我试图设置的属性类型,这些属性抛出异常-问题涉及字符串属性,并且setter似乎没有问题,因为在正常的非反射情况下工作。

objProp.PropertyTypedtoVal.GetType() 添加到 Watch 调试器窗口,并在调用 objProp.SetValue(...) 处设置断点。当断点被触发时,这两个表达式的求值结果是什么?它们需要相同。 - Michael Liu
1个回答

3
这个错误似乎出现在这里:
var objProp = dtoProps.SingleOrDefault(x => x.Name == dtoProp.Name);

我认为你的意思是:

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

谢谢,伙计 - 那是那种你盯着看了30分钟,但别人只需要3秒钟就能看出来的问题...! - Hanshan

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接