c#嵌套struct属性的反射

gal*_*13x 2 .net c# 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.
Run Code Online (Sandbox Code Playgroud)

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

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

Jon*_*eet 5

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

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

object nestedStruct = pInfo.GetValue(myObj);
Run Code Online (Sandbox Code Playgroud)

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

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

pInfo.SetValue(myObject, nestedStruct);
Run Code Online (Sandbox Code Playgroud)

尝试做你使用反射的事情是有益的:

MyObj myObj = new MyObj();
myObj.NestedStruct.MyIntProp = 23;
Run Code Online (Sandbox Code Playgroud)

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

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