【问题标题】:How to get properties of a type inside an object如何获取对象内部类型的属性
【发布时间】:2012-08-19 11:47:38
【问题描述】:

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

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&lt;Receivables&gt; genRecListList&lt;Dilution&gt; genDilListList&lt;Accountable&gt; genAccList, List&lt;Outstanding&gt; genOutList 属性??

我以前做过这个,但是用List(T) 和一次一个列表,它就起作用了。现在一团糟。

【问题讨论】:

    标签: c# linq list getproperties


    【解决方案1】:

    如果你想在List&lt;T&gt;中得到T类的Type

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

    所以你的代码应该改变:

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

    【讨论】:

    • 是的,这就是我昨天所做的。我太……了,直到我做对了才停下来。谢了。
    【解决方案2】:

    在我看来,你让自己变得比必要更难。你从你知道类型的列表开始。然后你把它们扔进一堆不起眼的列表中,类型信息被埋没了,你很难再把它挖出来。

    如何解决这个问题?

    基本上,您将两件事合二为一:创建DataTables 并将它们写入 Excel。这将有助于区分这些问题。这个呢:

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

    【讨论】:

    • 这就是问题所在,我需要它一次获取 4 个列表。有一个,很容易。谢了。
    • 嗯?您一次将一个列表转换为数据表,不是吗?
    猜你喜欢
    • 2018-08-12
    • 1970-01-01
    • 2019-12-04
    • 2021-09-21
    • 2013-09-07
    • 1970-01-01
    • 2010-11-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多