为什么反射不在Struct中设置属性?

时间:2011-07-07 09:19:20

标签: reflection c#-4.0 struct properties

   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();
    }

打印的第一个值是32,而第二个值是0.没有抛出异常

3 个答案:

答案 0 :(得分:12)

这是因为装箱你的结构会复制它,所以你应该先装箱,这样你就可以从你修改的相同数据中调用getter。以下代码有效:

    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();

答案 1 :(得分:4)

结构是ValueTypes,它们通过值传递,这意味着您只传递整个结构的副本,而不是对原始对象的引用。

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

答案 2 :(得分:1)

你仍然可以使用反射来改变它们,但它有点长篇大论。

请参阅此示例:http://social.msdn.microsoft.com/Forums/en/netfxbcl/thread/2dd4315c-0d0d-405c-8d52-b4b176997472