Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/csharp-4.0/2.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
Reflection 为什么';反射是否在结构中设置属性?_Reflection_C# 4.0_Struct_Properties - Fatal编程技术网

Reflection 为什么';反射是否在结构中设置属性?

Reflection 为什么';反射是否在结构中设置属性?,reflection,c#-4.0,struct,properties,Reflection,C# 4.0,Struct,Properties,打印的第一个值为32,第二个值为0。没有抛出异常您仍然可以使用反射更改它们,但这有点冗长 请参见此示例:结构是按值传递的值类型,这意味着您只传递整个结构的副本,而不是对原始对象的引用 因此,当您将其传递到info.SetValue(_priceStruct,32,null)中时,一个副本将传递给该方法并进行变异,因此原始对象根本不会被更改。可变结构是邪恶的另一个原因 这是因为装箱您的结构会复制它,所以您应该更早地装箱它,以便从您修改的相同数据调用getter。以下代码起作用: class

打印的第一个值为32,第二个值为0。没有抛出异常

您仍然可以使用反射更改它们,但这有点冗长


请参见此示例:

结构是按值传递的值类型,这意味着您只传递整个结构的副本,而不是对原始对象的引用


因此,当您将其传递到
info.SetValue(_priceStruct,32,null)
中时,一个副本将传递给该方法并进行变异,因此原始对象根本不会被更改。可变结构是邪恶的另一个原因

这是因为装箱您的结构会复制它,所以您应该更早地装箱它,以便从您修改的相同数据调用getter。以下代码起作用:

   class PriceClass {

        private int value;
        public int Value
        {
            get { return this.value; }
            set { this.value = value; }
        }           
    }


    struct PriceStruct
    {

        private int value;
        public int Value
        {
            get { return this.value; }
            set { this.value = value; }
        }
    }
    static void Main(string[] args)
    {
        PriceClass _priceClass = new PriceClass();
        Type type = typeof(PriceClass);
        PropertyInfo info = type.GetProperty("Value");
        info.SetValue(_priceClass, 32, null);
        Console.WriteLine(_priceClass.Value);

        PriceStruct _priceStruct = new PriceStruct();
        type = typeof(PriceStruct);
        info = type.GetProperty("Value");
        info.SetValue(_priceStruct, 32, null);
        Console.WriteLine(_priceStruct.Value);

        Debugger.Break();
    }

请参阅此问题的公认答案:+1您的示例表明我认为可以做到最好。在“安全”代码中,不可能使用反射更改真实值类型中的字段,但对于每个值类型,都有一个对应的装箱类类型。转换为具有讽刺意味的ValueType将把一个值类型转换为其对应的装箱类类型的实例,然后可以使用反射对其进行变异;经过变异后,装箱实例的内容可以复制回一个真正的值类型对象。谢谢。这是我第一次看到强制装箱(将结构转换为对象)和取消装箱(将对象转换为结构)以查看发生了什么并理解过程。其实很简单。但在我所看到的其他地方,装箱步骤都是由隐藏进程(由编译器自动完成)完成的,人们如何使用它毫无意义。
    object _priceStruct = new PriceStruct(); //Box first
    type = typeof(PriceStruct);
    info = type.GetProperty("Value");
    info.SetValue(_priceStruct, 32, null);
    Console.WriteLine(((PriceStruct)_priceStruct).Value); //now unbox and get value

    Debugger.Break();