2

我正在尝试对对象解析进行一些动态文本,但是,在为结构创建和设置嵌套属性值时遇到了障碍。

如果我在一个结构对象中有一个属性,那么每当我使用反射来获取结构对象并设置它的任何属性/字段时,对象上的值都不会改变。以下面的对象图为例。

public struct MyStruct
{
    public int MyIntProp {get;set;}
}

public class MyObj
{
    public MyStruct NestedStruct {get;set;}
}

PropertyInfo pInfo = (myObj.GetType()).GetProperty("NestedStruct");
object nestedStruct = pInfo.GetValue(myObj); // This is the nested struct however it is only a copy not the actual object
PropertyInfo intInfo = (pInfo.PropertyType).GetProperty("MyIntProp");
intInfo.SetValue(nestedStruct, 23); // this sets the MyIntProp on the nestedStruct, but it is not set on the myObj.NestedStruct.  My goal is to set object on that NestedStruct via reflection.

当我使用反射获取 NestedStruct 属性然后在该结构上设置 MyIntProp 时,原始的 MyObj.NestedStruct.MyIntProp 不会改变。自然,我将此归因于结构是值类型而不是引用类型的事实。

所以真正的问题是如何使用反射来获取对值类型的引用。

4

1 回答 1

5

如果我在一个结构对象中有一个属性,那么每当我使用反射来获取结构对象并设置它的任何属性/字段时,对象上的值都不会改变。

好吧,不 - 因为在这条线上:

object nestedStruct = pInfo.GetValue(myObj);

...您正在复制该值,因为它是一种值类型。你也在装箱——这很好,因为这意味着当你在intInfo.SetValue调用中改变它时,它是被修改的装箱副本。(如果您在调用时对其进行拳击intInfo.SetValue,那真的是没有希望的。)

在盒装副本中进行更改后,您需要将其设置对象的属性中:

pInfo.SetValue(myObject, nestedStruct);

尝试不使用反射来做你正在做的事情会很有启发性:

MyObj myObj = new MyObj();
myObj.NestedStruct.MyIntProp = 23;

编译器会在最后一行给你一个错误,解释这是一件愚蠢的事情:

Test.cs(20,9):错误 CS1612:无法修改“MyObj.NestedStruct”的返回值,因为它不是变量

于 2012-11-07T15:50:58.427 回答