C# 无法获取PropertyInfo.SetValue()来设置对象上的值

C# 无法获取PropertyInfo.SetValue()来设置对象上的值,c#,reflection,properties,foreach,C#,Reflection,Properties,Foreach,我已经将下面的代码简化为一个基本示例,但仍然无法获得要设置的值。执行propertyInfo.SetValue()时,它将在我的联系人对象的setter上遇到断点,并且该值在“setter”中设置正确。但是,在执行SetValue()后,我的projectContact.Contact对象上的字符串属性未更改为“a”。你知道我会做错什么吗 IEnumerable<ProjectContact> contacts = GetContactsByProject(projectId);

我已经将下面的代码简化为一个基本示例,但仍然无法获得要设置的值。执行propertyInfo.SetValue()时,它将在我的联系人对象的setter上遇到断点,并且该值在“setter”中设置正确。但是,在执行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);
                }
            }
        }
IEnumerable contacts=GetContactsByProject(projectId);
foreach(联系人中的项目联系人ProjectContact)
{
foreach(projectContact.Contact.GetType().GetProperties()中的PropertyInfo PropertyInfo)
{
if(propertyInfo.PropertyType==typeof(字符串))
{
propertyInfo.SetValue(projectContact.Contact,“a”,null);
}
}
}

我可以想到两种可能性:

  • 属性设置程序在属性上工作不正常。它可能设置了一个不同于属性getter的字段,因此当您设置属性时,您永远不会真正“设置”实际值
  • 如果“联系人”是结构(值类型),则projectCOntact.Contact将返回该结构的副本。这将阻止您更改“真实”对象

  • 我猜您的
    ProjectContact
    类型是
    struct

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

    您应该将
    ProjectContact
    类型更改为类



    也有可能您的setter中有一个bug。

    是的,您搞定了!这是一个结构,不是我的选择:)今天学到了一些新东西!