c#嵌套struct属性的反射

时间:2012-11-07 15:48:20

标签: c# .net reflection

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

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

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不会更改。当然,我将此归结为结构是值类型而不是引用类型的事实。

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

1 个答案:

答案 0 :(得分:5)

  

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

嗯,不 - 因为在这一行:

object nestedStruct = pInfo.GetValue(myObj);

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

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

pInfo.SetValue(myObject, nestedStruct);

尝试使用反射来做你正在做的事情而不是是有益的:

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

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

  

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