使用反射时,SetValue方法抛出异常

时间:2017-02-24 02:22:00

标签: c# .net reflection

我试图将值设置为许多对象中的属性。 我有一个接收2个参数MyStructuredObjects和MyObject的函数 MyStructuredObjects有一个MyObjects列表。 此功能是重新删除许多“如果”的工厂。

我想使用相同的对象,因为它在循环中使用它的功能。如果可能的话。 我遇到了例外情况'对象与目标'不匹配。 很抱歉发布了这个,但我没有发现像这样的问题,在对象结构中使用List。

看看:

public class MyStructuredObjects
{
    public List<MyObject1> Object1 { get; set; }
    public List<MyObject2> Object2 { get; set; }
    public List<MyObject3> Object3 { get; set; }
    public List<MyObject4> Object4 { get; set; }
    public List<MyObject5> Object5 { get; set; }
}

private void SetValuesToObjectsToIntegrate<T>(ref MyStructuredObjects returnedObject, T obj)
{
    Type t = obj.GetType();
    var propertyInfo = new ObjectsToIntegrate().GetType().GetProperties();
    var instance = Activator.CreateInstance(t);
    foreach (var item in returnedObject.GetType().GetProperties())
    {
        var itemType = item.PropertyType;
        if (t == itemType)      // PASSING BY HERE OK , it finds the same type :P
        {
            item.SetValue(t, Convert.ChangeType(obj, item.PropertyType), null);
        }
    }
}

更新:代码应为:

item.SetValue(instance, Convert.ChangeType(obj, item.PropertyType), null);

1 个答案:

答案 0 :(得分:0)

我想我明白你要做的是什么。

您似乎正在尝试设置如下属性:

var o2 = new List<MyObject2>();
var mso = new MyStructuredObjects();
SetValuesToObjectsToIntegrate(ref mso, o2);

因为mso的类型与属性类型匹配,Object2将设置其属性o2

如果是这种情况,那么您只需要这段代码:

private void SetValuesToObjectsToIntegrate<T>(MyStructuredObjects returnedObject, T obj)
{
    foreach (var propertyInfo in typeof(MyStructuredObjects).GetProperties())
    {
        if (typeof(T) == propertyInfo.PropertyType)
        {
            propertyInfo.SetValue(returnedObject, obj, null);
        }
    }
}

由于您未更改MyStructuredObjects returnedObject的实例,因此无需在ref之后传递returnedObject

使用此方法调用此代码:

var o2 = new List<MyObject2>();
var mso = new MyStructuredObjects();
SetValuesToObjectsToIntegrate(mso, o2);

接到这个电话后,我现在得到:

result