繁体   English   中英

C#嵌套结构体属性的反射

[英]c# Reflection of a nested struct property

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

如果我在作为结构的对象中有一个属性,则每当我使用反射获取该结构对象并设置其任何属性/字段时,该对象上的值都不会更改。 拿下面的对象图。

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不会更改。 自然,我将其归因于struct是值类型而不是引用类型的事实。

因此,真正的问题是我如何使用反射来获取对值类型的引用。

如果我在作为结构的对象中有一个属性,则每当我使用反射获取该结构对象并设置其任何属性/字段时,该对象上的值都不会更改。

好吧,不-因为在这一行:

object nestedStruct = pInfo.GetValue(myObj);

...您正在复制值,因为它是值类型。 您还可以将其装箱-很好,因为这意味着当您在intInfo.SetValue调用中对其进行突变时,它是被装箱的副本。 (如果要在调用intInfo.SetValue时将其intInfo.SetValue ,那将是毫无希望的。)

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

pInfo.SetValue(myObject, nestedStruct);

尝试使用反射来做您正在做的事情将是有益的:

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

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM