C # - Динамическое приведение с использованием отражения - PullRequest
1 голос
/ 18 июля 2011

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

Я много чищу здесь голову!

foreach (PropertyInfo pi in zAccount)
                {
                    object o = row[pi.Name];
                    if (o.GetType() != typeof(DBNull))
                    {
                        pi.SetValue(a, o, null);
                    }
                 }

Это дает мне ошибки преобразования типов:

Объект типа «System.String» нельзя преобразовать в тип «System.Nullable`1 [System.Boolean] '.

Итак, идеал будет примерно таким:

foreach (PropertyInfo pi in zAccount)
                {
                    object o = typeof(pi.GetType())row[pi.Name];
                    pi.SetValue(a, o, null);
                 }

Ответы [ 3 ]

5 голосов
/ 18 июля 2011

Вот фрагмент кода, который я использую, чтобы сделать именно то, что вы пытаетесь сделать; конвертировать типы из БД. Обычно вы можете использовать Convert.ChangeType, но это не работает с обнуляемыми типами, поэтому этот метод обрабатывает этот случай.

/// <summary>
/// This wrapper around Convert.ChangeType was done to handle nullable types.
/// See original authors work here: http://aspalliance.com/852
/// </summary>
/// <param name="value">The value to convert.</param>
/// <param name="conversionType">The type to convert to.</param>
/// <returns></returns>
public static object ChangeType(object value, Type conversionType)
{
  if (conversionType == null)
  {
    throw new ArgumentNullException("conversionType");
  }
  if (conversionType.IsGenericType && conversionType.GetGenericTypeDefinition().Equals(typeof(Nullable<>)))
  {
    if (value == null)
    {
      return null;
    }
    NullableConverter nullableConverter = new NullableConverter(conversionType);
    conversionType = nullableConverter.UnderlyingType;
  }
  return Convert.ChangeType(value, conversionType);
}

Затем вы бы использовали его как:

foreach (PropertyInfo pi in zAccount)
{
  object o = ChangeType(row[pi.Name], pi.GetType());
  pi.SetValue(a, o, null);
}

Edit:

Собственно, перечитав ваше сообщение, ваше сообщение об ошибке

Объект типа 'System.String' нельзя преобразовать в тип 'System.Nullable`1 [System.Boolean]'.

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

0 голосов
/ 18 июля 2011

Это потому, что ваши строки содержат данные с типами, которые не соответствуют типам свойств класса учетной записи.

Почему это так, я не знаю, не увидев больше вашего кода.

0 голосов
/ 18 июля 2011

Просто догадываюсь, но может быть, что ваш o является строкой (например, "false"), а ваше свойство может быть bool, и, следовательно, ошибкой.

Вы можете использовать Convert.ChangeType.Это может помочь

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