Я использую следующий код, чтобы установить свойство класса с использованием RelectionInvalid Cast при использовании Reflection SetValue
MyClasss c = new MyClass(id);
prop = c.GetType().GetProperty(field);
prop.SetValue(c, Convert.ChangeType(value, prop.PropertyType), null);
Значения берутся из DataGridView и срабатывает по событию CellEndEdit и поэтому входное значения пользователя может быть любым большим количеством свойств и типов.
Иногда Convert.ChangeType работает успешно, но иногда я получаю ошибку Invalid Cast.
Например, если тип свойства (десятичный?) [С нулевым числом знаков] Я получаю сообщение об ошибке.
[EDIT]
Как немного больше фона того, что я делаю, то DataGridView содержит информацию относительно того, что недавних изменений пользователей сделали с данными сервера SQL. Он содержит список изменений, отображающих таблицу, поле, новое значение и старое значение, а также сведения о том, кто внес изменения и когда. Существует опция «Отменить», если менеджер не согласен с одним из изменений. Поэтому, когда выбран элемент из списка, мой код должен искать соответствующую таблицу и поле и устанавливать текущее значение обратно на сохраненное значение oldvalue. Это средство контроля аудита, которое клиент специально хотел как DataGrid.
Проблема состоит в том, что из-за количества полей, отображаемых на datagrid, тип данных может быть любым и не знать до времени выполнения. Я, честно говоря, не знаю, как я могу использовать DataBinding в этих обстоятельствах, но если кто-то по-прежнему считает, что это лучший вариант, чем Reflection, возможно, они могут указать мне в правильном направлении, пожалуйста.
Почему вы не используете привязку данных? Для этого он предназначен. Код, который вы написали, - это повторное изобретательство колеса. – Dennis
Вход на самом деле происходит из DataGridView, который отображает данные из нескольких разных таблиц, и существует много свойств и типов, которые он покрывает. Я не уверен, как использовать DataBinding в этих обстоятельствах. – PJW
Итак, ваша проблема может быть разбита на 'Convert.ChangeType (« 12 », typeof (decimal?))'? –