Почему отражение не устанавливает свойство в Struct? - PullRequest
8 голосов
/ 07 июля 2011
   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 ]

12 голосов
/ 07 июля 2011

Это потому, что упаковка вашей структуры делает ее копию, поэтому вы должны сделать это раньше, чтобы вызывать метод получения из тех же данных, которые вы изменили.Работает следующий код:

    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();
4 голосов
/ 07 июля 2011

структуры - это ValueTypes, которые передаются по значению, что означает, что вы передаете только копии всей структуры, а не ссылку на исходный объект.

Таким образом, когда вы передаете его в info.SetValue(_priceStruct, 32, null), копия передается методу и изменяется, поэтому исходный объект не изменяется вообще.Еще одна причина, почему изменчивые структуры являются злом.

1 голос
/ 07 июля 2011

Вы все еще можете изменить их, используя отражение, но оно немного затянуто.

См. Этот пример: http://social.msdn.microsoft.com/Forums/en/netfxbcl/thread/2dd4315c-0d0d-405c-8d52-b4b176997472

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...