如何在对象内获取类型的属性

时间:2012-08-19 11:47:38

标签: c# linq list getproperties

我有这个代码。我收到几个列表作为参数插入对象列表。

public static void SaveTransactionsToSeparateFiles(List<Receivables> genRecList, 
    List<Dilution> genDilList, List<Accountable> genAccList, string excelFile, 
    string typeReport, List<Outstanding> genOutList = null)
{
    List<object> listObj = new List<object> 
    { 
        genRecList, 
        genDilList, 
        genAccList, 
        genOutList 
    };
}

然后我有一个foreach,我遍历List(object) listObj中的所有列表,将它们转换为数据表并添加每个数据表中每个列表的内容。

foreach (var obj in listObj)
{
    DataTable genTable = HelperMethods.ConvertListToDataTable(obj, true);
    Worksheet pantaReiWorkSheet = pantaReiWorkSheets[sheet.SheetName];

    int iRow = 0;
    foreach (DataRow row in genTable.Rows)
    {
        iRow++;

        int iCol = 0;
        foreach (DataColumn col in genTable.Columns)
        {
            iCol++;
            pantaReiWorkSheet.Cells[iRow + 1, iCol] = row[col.ColumnName];
        }
    }

    i++;
}

然后我将转换为数据表方法。

public static DataTable ConvertListToDataTable(object genList, bool toExcel)
{
    DataTable genDt = new DataTable();
    PropertyInfo[] p =  p.genList.GetType().GetProperties();

    for (int prop = 1; prop < p.Length - 2; prop++)
    {
        genDt.Columns.Add(new DataColumn(p[prop].Name, p[prop].PropertyType));
    }

    foreach (object t in (IEnumerable<object>)genList)
    {
        DataRow genDR = genDt.NewRow();

        for (int prop = 1; prop <  p.Length - 2; prop++)
        {
            genDR[p[prop].Name] = p[prop].GetValue(t, null);
        }

        genDt.Rows.Add(genDR);
    }

    return genDt;
}   

问题是,我没有在List listObj中查找每个列表的属性。 那么,我如何访问List<Receivables> genRecListList<Dilution> genDilList,             List<Accountable> genAccListList<Outstanding> genOutList属性??

之前我已经完成了这项工作,但是List(T)和一次只有一个列表并且有效。现在一团糟。

2 个答案:

答案 0 :(得分:0)

如果您想在Type中获得T课程List<T>

var list = new List<T>();
var typeT = list.GetType().GenericTypeArguments.First();

所以你的代码应该改变:

PropertyInfo[] p =  genList.GetType().GenericTypeArguments
                           .First().GetProperties();

答案 1 :(得分:0)

在我看来,你自己比必要时更难。您从列表中了解其中的类型。然后你将它们扔进一堆不起眼的清单中,类型信息被埋没了,你给自己很难再把它挖出来。

如何解决此问题?

基本上,你要做两件事:创建DataTable并将它们写入Excel。这有助于区分这些问题。那怎么样:

  • 创建方法DataTable ConvertListToDataTable<T>(List<T>)并使用泛型类型参数T获取PropertyInfo
  • 分别为每个列表调用此方法,并将数据表放在列表中。
  • 然后执行SaveDataTablesToSeparateFiles(List<DataTable> tables, string excelFile, string typeReport)
  • 之类的操作