1

我正在尝试使用反射获得 Byte[] 。不幸的是结果它总是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[];
        }
    }
}
4

2 回答 2

4

你的代码看起来很奇怪。您正在创建参数类型的实例并尝试从该实例获取值。您应该改用参数本身:

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[];
        }
    }
}

顺便提一句:

  1. return true在返回的方法中void是非法的,会导致编译器错误。
  2. 在您的情况下无需使用反射。你可以简单地这样写:

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

    仅当在派生类上而非仅在派生类上Content定义时才适用。BusinessObject

于 2012-10-10T09:25:13.060 回答
1

从您的代码片段看来,您没有填充任何值。

Object obj = Activator.CreateInstance(boType); 

这只会调用默认构造函数并为所有类型分配默认值。对于 byte[] 它是null

它应该是

item.GetValue(document, null)
于 2012-10-10T09:27:37.627 回答