BoySetsFire Ответов: 3

Приведение отраженных объектов не работает


Привет, Эксперты!
У меня небольшая проблема.
Я хочу манипулировать отраженным объектом, но я слишком глуп, чтобы использовать этот тип данных :(
Пожалуйста, помогите мне :)
Это моя идея:
Но это не работает




myObjectFromDB = GetFromDB(); // Get the object via Entity Framework form DB

for(...)
{

						//item.Key = myPropertyName;
						//item.Value = true (as string)
						
						// The property 'myPropertyName' is in my DB a nullable bool
						

                        PropertyInfo propInfo = typeof(myObject).GetProperty(item.Key);

                        dynamic property = propInfo.GetValue(myObjectFromDB, null);
                        dynamic propertyType = property.GetType();

                        dynamic newVal = item.Value;

                        Convert.ChangeType(newVal, propertyType);

                        propInfo.SetValue(myObjectFromDB, newVal);
						// The  propInfo.SetValue throws the error!
						// Error: Das Objekt mit dem Typ "System.String" kann nicht in den Typ "System.Nullable`1[System.Boolean]" konvertiert werden. 
						//-> Can´t convert the Object from String to Boolean
						
}


Что я уже пробовал:

какие-то глупости, но это не работает

StM0n

Прежде всего, почему вы используете dynamic? Имхо, в этом нет особой необходимости... по крайней мере, сформулируйте мою точку зрения, но я могу ошибаться.

Угадайте, что значение, которое вы пытаетесь преобразовать, на самом деле не конвертируется... :) получаете ли вы "фальш" или "Вар" через свою БД?

BoySetsFire

Привет &амп; Спасибо за ваш ответ... динамика исходит из тестирования... если я бросаю вручную, это работает как convert.tobool(val)

тип данных в БД немного

br,
Бенни

StM0n

Так что, возможно, вам стоит провести несколько тестов с конверсией, чтобы получить правильную информацию :)

3 Ответов

Рейтинг:
22

Richard Deeming

Цитата:
Преобразовать.ChangeType (newVal, propertyType);
propInfo. SetValue(myObjectFromDB, newVal);

Вот в чем твоя проблема - Convert.ChangeType возвращает результат преобразования. Это не меняет тип объекта, который вы передали.

Вам также нужно будет использовать property.PropertyType вместо property.GetType(). Первый возвращает объявленный тип свойства; второй вернет typeof(PropertyInfo).

РЕДАКТИРОВАТЬ: Похоже, у вас также возникнут проблемы с конверсией - ChangeType не может справиться с преобразованием строки В тип nullable и дает вам InvalidCastException Вместо этого вам нужно будет преобразовать его в базовый тип.

Попробуйте изменить свой код на:
Type propertyType = property.PropertyType;
Type realPropertyType = Nullable.GetUnderlyingType(propertyType) ?? propertyType;
object newPropertyValue = Convert.ChangeType(newVal, realPropertyType);
propInfo.SetValue(myObjectFromDB, newPropertyValue);


Рейтинг:
2

Ralf Meier

Объект, в который вы хотите привести, должен быть объявлен как тип, который должен быть местом назначения ...
Некоторые части не могут быть переменными ... они (Тип из этого) должны быть указаны ...


Рейтинг:
0

BoySetsFire

Ричард, спасибо!!!

Вчера после 10 часов работы мой мозг был похож на вялое печенье ;)

новый день, новая удача :)

Большое спасибо всем, кто прочитал эту тему

br,

Бенни