Почему мой код для установки значений свойств с использованием отражения не работает?

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

foreach (UserProfile.UserProfileRecord r in rslt.record)
{
    UserProfileRecord upr = new UserProfileRecord();
    Type uprType = upr.GetType();
    foreach (PropertyInfo p in r.GetType().GetProperties())
    {
        Debug.WriteLine(p.Name + " : " + p.GetValue(r));
        PropertyInfo pi = uprType.GetProperty(p.Name);
        pi.SetValue(upr, p.GetValue(r));
        Debug.WriteLine(pi.Name + " - " + pi.GetValue(upr));
    }
}

Вывод отладки выглядит следующим образом:

city : YERMO city -
state : CA state -
zip : 92398 zip -
telephone : 714-256-8463 telephone -

Я сравнил свой код с несколькими другими примерами в Microsoft и SO и не вижу ничего, что я делаю неправильно.

Я передаю структуру обратно вызывающей стороне, и она используется в качестве источника данных для DataGridView. Имена столбцов отображаются, но ячейки пусты. При остановке в перерыве и просмотре структуры я вижу, что все значения свойств равны нулю.

Что я делаю неправильно?


person tolsen64    schedule 09.01.2019    source источник
comment
Вы создаете новый экземпляр, назначаете его upr и выбрасываете. Разве вы не должны поместить их в список или что-то в этом роде?   -  person John Wu    schedule 09.01.2019
comment
Да, я добавляю их в список, но не думаю, что это имеет отношение к вопросу.   -  person tolsen64    schedule 09.01.2019
comment
Структура имеет тип значения. Итак, обычно, когда вы передаете переменную upr в pi.SetValue(upr, p.GetValue(r)) , она создает еще одну копию переменной и присваивает значение новой. Вы можете упаковать upr в объект перед вызовом метода SetValue и распаковать его позже. Это должно исправить это   -  person Bharathi    schedule 09.01.2019