【问题标题】:Cannot get PropertyInfo.SetValue() to set the value on my object无法获取 PropertyInfo.SetValue() 来设置我的对象的值
【发布时间】:2011-03-27 11:25:05
【问题描述】:

我已将下面的代码简化为一个基本示例,但我仍然无法获得要设置的值。执行 propertyInfo.SetValue() 时,它将在我的 Contact 对象的设置器上命中一个断点,并且该值在“设置器”中正确设置。但是,在 SetValue() 执行后,我的 projectContact.Contact 对象上的字符串属性尚未更改为“a”。知道我在这里做错了什么吗?

IEnumerable<ProjectContact> contacts = GetContactsByProject(projectId);

        foreach (ProjectContact projectContact in contacts)
        {
            foreach (PropertyInfo propertyInfo in projectContact.Contact.GetType().GetProperties())
            {
                if (propertyInfo.PropertyType == typeof(string))
                {
                    propertyInfo.SetValue(projectContact.Contact, "a", null);
                }
            }
        }

【问题讨论】:

    标签: c# reflection properties foreach


    【解决方案1】:

    我能想到两种可能:

    1. 属性设置器无法在属性上正常工作。它可能设置了与属性 getter 不同的字段,因此当您设置属性时,您从未真正“设置”实际值。
    2. 如果“Contact”是结构(值类型),projectCONtact.Contact 将返回结构的副本。这将阻止您更改“真实”对象。

    【讨论】:

    • 是的,你成功了!这是一个结构,不是我选择的 :) 今天学到了一些新东西!
    【解决方案2】:

    我猜你的ProjectContact 类型是struct

    由于结构是按值传递的,因此您在结构的副本上设置值,然后将其丢弃。
    这就是为什么可变结构是邪恶的,应该不惜一切代价避免。

    您应该将ProjectContact 类型更改为类。


    您的设置器中也可能存在错误。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-03-15
      • 2014-08-12
      • 1970-01-01
      相关资源
      最近更新 更多