Установка значения через отражение не работает - PullRequest
3 голосов
/ 07 января 2010

Я пытаюсь установить значение с помощью отражения. Я создал эту маленькую тестовую программу

    struct headerIndexes
    {
        public int AccountNum{ get; set; }
        public int other { get; set; }
        public int items { get; set; }
    }
    static void Main(string[] args)
    {

        headerIndexes headers = new headerIndexes();
        headers.AccountNum = 1;
        Console.WriteLine("Old val: {0}", headers.AccountNum);
        foreach (var s in headers.GetType().GetProperties())
        {
            if (s.Name == "AccountNum")
                s.SetValue(headers, 99, null);
        }
        Console.WriteLine("New val: {0}", headers.AccountNum);
        Console.ReadKey();
    }

При выполнении программы я вижу, что она правильно выполняет команду s.SetValue(headers, 99, null);, однако значение headers.AccountNum остается равным 1 при запуске setValue.

Я пропустил очевидный шаг?

Ответы [ 3 ]

3 голосов
/ 07 января 2010

Я думаю, что заголовки могут быть упакованы в новый объект, так как это структура, тогда объект получает сборщик мусора, как только возвращается SetValue. Измените его на класс и посмотрите, исчезнет ли проблема.

1 голос
/ 25 марта 2010

Также вы можете использовать распакованную версию struct.
объект unboxedHeader = заголовки;
s.SetValue (unboxedHeader, 99, null);

struct headerIndexes 
{ 
    public int AccountNum{ get; set; } 
    public int other { get; set; } 
    public int items { get; set; } 
} 
static void Main(string[] args) 
{ 

    headerIndexes headers = new headerIndexes(); 
    headers.AccountNum = 1; 
    Console.WriteLine("Old val: {0}", headers.AccountNum); 
    object unboxedHeader=headers;
    foreach (var s in headers.GetType().GetProperties()) 
    { 
        if (s.Name == "AccountNum") 
            s.SetValue(unboxedHeader, 99, null); 
    } 
    Console.WriteLine("New val: {0}", headers.AccountNum); 
    Console.ReadKey(); 
} 
1 голос
/ 07 января 2010

SetValue ожидает object, который вызывает операцию бокса на headers. Поскольку headers является struct, это тип значения. Поэтому копия сделана, и вы изменяете объект в штучной упаковке, а не headers.

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

С Эрик Липперт :

Это еще одна причина, по которой изменчивые типы значений являются злом. Старайтесь всегда делать типы значений неизменяемыми.

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