繁体   English   中英

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

[英]SetValue Method throw Exception when using reflection

我正在尝试为许多对象的属性设置值。 我有一个函数,它接收2个参数MyStructuredObjects和MyObject MyStructuredObjects有一个MyObjects列表。 此函数是一个重构工厂,用于删除很多“ if”。

我想使用同一对象,因为它的功能是在循环中使用。如果可能的话。 我遇到过异常“对象与目标不匹配”。 很抱歉张贴此,但我没有发现这样的问题,使用对象结构内的列表。

看一看 :

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);

我想我了解您正在尝试做的事情。

看来您正在尝试设置以下属性:

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

由于o2的类型与属性类型匹配,因此该mso将设置其属性Object2

如果是这样,那么您只需要以下代码:

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 returnedObjectref为你不改变的情况下returnedObject

使用它来调用此代码:

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

打电话之后,我得到:

结果

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM