2013-11-13 2 views
0

Я использую следующий код, чтобы установить свойство класса с использованием 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, возможно, они могут указать мне в правильном направлении, пожалуйста.

+0

Почему вы не используете привязку данных? Для этого он предназначен. Код, который вы написали, - это повторное изобретательство колеса. – Dennis

+0

Вход на самом деле происходит из DataGridView, который отображает данные из нескольких разных таблиц, и существует много свойств и типов, которые он покрывает. Я не уверен, как использовать DataBinding в этих обстоятельствах. – PJW

+1

Итак, ваша проблема может быть разбита на 'Convert.ChangeType (« 12 », typeof (decimal?))'? –

ответ

2

value типов, принятых Convert.ChangeType должно быть выполнено IConvertible. Очевидно, что вы конвертируете произвольные типы, поскольку они не реализуют интерфейс, вы получите недопустимое исключение литых.

Convert.ChangeType

Смежные вопросы