Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/20.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
嵌套结构属性的c#反射_C#_.net_Reflection - Fatal编程技术网

嵌套结构属性的c#反射

嵌套结构属性的c#反射,c#,.net,reflection,C#,.net,Reflection,我试图进行一些动态文本到对象解析,但是,在为结构创建和设置嵌套属性值时遇到了一个障碍 如果我的对象中有一个属性是结构,那么每当我使用反射来获取结构对象并设置它的任何属性/字段时,对象上的值都不会更改。以下面的对象图为例 public struct MyStruct { public int MyIntProp {get;set;} } public class MyObj { public MyStruct NestedStruct {get;set;} } 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不会更改。当然,我将这归因于结构是值类型而不是引用类型

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

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

不,因为在这条线上:

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):错误CS1612:无法修改“MyObj.NestedStruct”的返回值,因为它不是变量


有没有可能避免从可变结构开始呢?我正在制作一个库,它允许将分隔文件解析为动态对象。到目前为止,它与纯引用类型对象一起工作。然而,当进入值类型容器时,我似乎遇到了这个问题,所以不要使用“值类型容器”。基本上,可变结构只是个坏消息。我明白了。我正在做的项目是关于运动模拟的。因此,我有包含纯值类型(主要是双值)的运动对象。当时我认为使运动对象不可变将有利于防止任何调用方法损坏原始数据。也许这是使用结构的错误推理?我认为它们类似于DateTime或TimeSpan对象。使用结构可能很好(如果没有更多的上下文,我就说不出来)-但您给出的示例显然不是一成不变的!在我使用structs的所有时间里,我从未遇到过这种情况。我不太明白为什么。你能给我指一些可能解释它为什么不是变量的文档吗?经过思考,它为什么不是变量是完全有道理的,因为它是一组属性而不是字段。@galford13x:很高兴我不需要尝试进入它:)(恐怕我只看到了你之前的评论。)