遍历匿名类型列表的对象属性

Iterate over object properties of an anonymous type list

我正在使用 EPPlus 创建一个 "Export to Excel" 助手。这基本上会采用匿名列表并使用该列表来填充电子表格。

我希望能够遍历列表对象的属性并确定哪个是 datetime 并适当地设置该列的格式。我在下面的代码有效,但是有没有更简洁的方法来编写这个 - 特别是我不依赖于从列表中拉出一个对象并对该对象进行操作的地方(即我得到 属性 类型来自列表本身)?

    private static string[] columnIndex = "A,B,C,D,E,F,G,H,I,J,K,L,M,N,O,P,Q,R,S,T,U,V,W,X,Y,Z".Split(',');
    private static ExcelWorksheet CreateAndFormatWorksheet<T>(OfficeOpenXml.ExcelPackage pck, List<T> dataSet)
    {
        ExcelWorksheet ws = pck.Workbook.Worksheets.Add("Monet_Export_" + DateTime.Now.ToString());
        ws.Cells["A1"].LoadFromCollection(dataSet, true);

        if (dataSet.Count > 0)
        {
            // Pull first list item to determine so we have something to iterate over below
            dynamic first = dataSet[0];

            // List count == upper row count for the spreadsheet
            string rowCount = dataSet.Count.ToString();

            int i = 0;
            foreach (PropertyInfo info in first.GetType().GetProperties())
            {
                if (info.PropertyType == typeof(DateTime))
                {
                    string column = columnIndex[i];
                    string indexer = column + "2:" + column + rowCount;
                    ws.Cells[indexer].Style.Numberformat.Format = "mm/dd/yyyy";
                }
                else if (info.PropertyType == typeof (int))
                {
                    string column = columnIndex[i];
                    string indexer = column + "2:" + column + rowCount;
                    ws.Cells[indexer].Style.Numberformat.Format = "@";                        
                }

                i++;
            }                
        }

        return ws;
    }

您可以使用 typeof(T).GetProperties() 获取类型 T 的属性。这也适用于匿名类型。

这样您就不需要拉出第一项来检查其属性,也不必检查 dataSet.Count > 0(如果您希望允许一个空电子表格)。