我正在尝试将一些动态文本用于对象解析,但是,在为结构创建和设置嵌套属性值时,我遇到了麻烦。
如果我在一个结构的对象中有一个属性,每当我使用反射来获取结构对象并设置它的任何属性/字段时,对象上的值就不会改变。拿下面的对象图。
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不会更改。当然,我将此归结为结构是值类型而不是引用类型的事实。
所以真正的问题是如何使用反射来获取对值类型的引用。
答案 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'的返回值,因为它不是变量