Получение байта [] из PropertyInfo возвращает NULL

58
7

Я пытаюсь получить байт [], используя отражение. К сожалению, результат всегда равен NULL. Свойство заполнено данными. Вот мой фрагмент кода.

public static void SaveFile(BusinessObject document)
{
Type boType = document.GetType();
PropertyInfo[] propertyInfo = boType.GetProperties();
Object obj = Activator.CreateInstance(boType);
foreach (PropertyInfo item in propertyInfo)
{
Type xy = item.PropertyType;
if (String.Equals(item.Name, "Content") && (item.PropertyType == typeof(Byte[])))
{
Byte[] content = item.GetValue(obj, null) as Byte[];
}
}
return true;
}

Здесь рабочий код:

    public static void SaveFile(BusinessObject document)
{
Type boType = document.GetType();
PropertyInfo[] propertyInfo = boType.GetProperties();
foreach (PropertyInfo item in propertyInfo)
{
if (String.Equals(item.Name, "Content") && (item.PropertyType == typeof(Byte[])))
{
Byte[] content = item.GetValue(document, null) as Byte[];
}
}
}

спросил(а) 2012-10-10T12:22:00+04:00 8 лет назад
1
Решение
59

из вашего фрагмента кода кажется, что вы не заселяете какое-либо значение.

Object obj = Activator.CreateInstance(boType); 

это просто вызовет константный consturctor и присваивает значения по умолчанию для всех типов. и для байта [] он равен нулю

должен быть

item.GetValue(document, null)

ответил(а) 2012-10-10T12:27:00+04:00 8 лет назад
90

Ваш код выглядит странно. Вы создаете новый экземпляр типа параметра и пытаетесь получить значение из этого экземпляра. Вместо этого вы должны использовать сам параметр:

public static void SaveFile(BusinessObject document)
{
Type boType = document.GetType();
PropertyInfo[] propertyInfo = boType.GetProperties();
foreach (PropertyInfo item in propertyInfo)
{
Type xy = item.PropertyType;
if (String.Equals(item.Name, "Content") &&
(item.PropertyType == typeof(Byte[])))
{
Byte[] content = item.GetValue(document, null) as Byte[];
}
}
}

КСТАТИ:

return true в методе, возвращающем void является незаконным и приведет к ошибке компилятора.

В вашем случае нет необходимости использовать отражение. Вы могли бы просто написать это:

public static void SaveFile(BusinessObject document)
{
Byte[] content = document.Content;
// do something with content.
}

Это справедливо только в том случае, если Content определен в BusinessObject а не только на производных классах.

ответил(а) 2012-10-10T12:25:00+04:00 8 лет назад
Ваш ответ
Введите минимум 50 символов
Чтобы , пожалуйста,
Выберите тему жалобы:

Другая проблема