从PropertyInfo []获取值时如何传递正确的目标

时间:2016-04-12 01:45:09

标签: c# types propertyinfo

在第一个内部循环中,当从PropertyInfo[]获取值时,我能够传递正确的目标对象,但是在第二个内部循环中,它给出了目标对象不正确的异常。

所以我想要的是获取具有此listProperties[j]内部属性的属性的所有值,如何正确传递目标对象以获取所有这些值?

模型数据:

public class Foo
{
    public string Name { get; set; }
    public Bar BarProp { get; set; }
}

public class Bar
{
    public string Name { get; set; }
    public decimal Value { get; set; }
}

方式:

private void CreateDataRow(ISheet sheet, IList iList)
{
    for (int i = 0; i < iList.Count; i++)
    {

        var listType = iList[i].GetType();
        var listProperties = listType.GetProperties(BindingFlags.Public | BindingFlags.Instance);

        for (int j = 0; j < listProperties.Count(); j++)
        {
            int columnCount = j;

            if (IsPrimitiveType(listProperties[j].PropertyType))
            {
                var columnData = listProperties[j].GetValue(iList[i], null) ?? "-";
                var dataTypeValue = Convert.ChangeType(columnData, listProperties[j].PropertyType);

                //omitted codes

                continue;
            }

            var innerProperties = listProperties[j].PropertyType.GetProperties().ToArray();

            for (int k = 0; k < innerProperties.Count(); k++)
            {
                //this throws an exception
                var columnData = innerProperties[k].GetValue(listProperties[j], null) ?? "-";

                //omitted codes
            }
        }
    }

}
在这里调用

CreateDataRow

private XSSFWorkbook CreateWorkbook(T model)
{
    var workbook = new XSSFWorkbook();

    var type = model.GetType();

    var properties = type.GetProperties(BindingFlags.Public | BindingFlags.Instance);

    foreach (var property in properties)
    {
        //check if the property is a list
        if (property.PropertyType.IsGenericType &&
            typeof(List<>).IsAssignableFrom(property.PropertyType.GetGenericTypeDefinition()))
        {
            var propertyValueList = (IList)property.GetValue(model, null);

            if (propertyValueList != null && propertyValueList.Count > 0)
            {

                //create data row
                CreateDataRow(sheet, propertyValueList);
            }
        }
    }
    return workbook;
}

T模型使用此模型:

public class ExportModel
{
   public List<Foo> FooList { get; set; }
}

1 个答案:

答案 0 :(得分:2)

在这行代码中:

var innerProperties = listProperties[j].PropertyType.GetProperties().ToArray(); 

您正在获取listProperties[j].PropertyType的属性,但在GetValue中:

var columnData = innerProperties[k].GetValue(listProperties[j], null) ?? "-";

您正在发送listProperties[j]作为实例参数。更正以下行之一:

var innerProperties = listProperties[j].GetProperties().ToArray();  
//or  
var columnData = innerProperties[k].GetValue(listProperties[j].PropertyType, null) ?? "-";

对象实例与其类型之间存在差异。 PropertyType表示检索到的Property的类型,其行为如下:

propertyInfo.GetValue(x,y).GetType();

您应该发送目标对象的确切实例,而不是其类型,而不是已检索属性的类型。如果你想得到属性的一个属性的值写:

var columnData = innerProperties[k].GetValue(listProperties[j].GetValue(iList[i],null) ,null) ?? "-";