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

标签 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 不会更改。当然,我将此归因于结构是值类型而不是引用类型这一事实。

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

最佳答案

If I have a property in an object that is a struct, whenever I use reflection to obtain the struct object and set any of it's properties/fields, the value on the object is not changed.

嗯,不 - 因为在这一行:

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): error CS1612: Cannot modify the return value of 'MyObj.NestedStruct' because it is not a variable

关于C# 嵌套结构体属性的反射,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13273180/

相关文章:

c# - WPF 无法聚焦 TextBox

c# - .NET 正则表达式无法识别的分组构造

c# - 如何使用 WriteEndElement 检查元素名称

c# - 为什么加载包含值类型字段的类会强制 CLR 加载该值类型?

c# - Enumerable.Last<T>() 和 C# 数组

c# - 无法编译 assemblyFileBinding

c# - 使用太多 bool 值

c# - 从抽象类反射(reflect)实现的私有(private)方法?

Java反射,调用传入对象的类的方法

c++ - 通过变量名遍历结构