3

IEnumerableをobject[、]に変換するジェネリックメソッドを構築しようとしています。これの目的は、理想的には2Dオブジェクト配列を必要とするExcelDNAを介してExcelに挿入することです。

私は振り返りに不慣れで、ここのギャップを埋めるためにいくつかの深刻な助けが必要です。以下に投稿されたコードは私がこれまでに持っているものです。必要なのは、外側のループのDataSourceのインデックスiでTのプロパティを取得することです。次に、内側のループで各プロパティの値を順番に取得し、object [、]に挿入します。

助けていただければ幸いです。ありがとうリチャード

    public object[,] ConvertListToObject<T>(IEnumerable<T> DataSource)
    {
        int rows = DataSource.Count();

        //Get array of properties of the type T
        PropertyInfo[] propertyInfos;
        propertyInfos = typeof(T).GetProperties(BindingFlags.Public);

        int cols = propertyInfos.Count();   //Cols for array is the number of public properties

        //Create object array with rows/cols
        object[,] excelarray = new object[rows, cols];

        for (int i = 0; i < rows; i++) //Outer loop
        {
            for(int j = 0; j < cols; j++) //Inner loop
            {
                object[i,j] =             //Need to insert each property val into j index
            }
        }
        return excelarray;
       }
}
4

3 に答える 3

5

あなたはかなり近いです。いくつかの指針:

  • 一般に、 byインデックスforeachに効率的にアクセスすることはできないため、外側のループはループである必要があります。IEnumerable
  • GetPropertiesBindingFlags.Staticまたは.Instance何かを返すために必要です。
  • 実際の値を取得するには、を呼び出しpropertyInfos[j].GetValue、取得するインスタンスとインデクサー値の配列を渡しTます。通常のプロパティの場合はnullですが、オブジェクトにインデックス付きのプロパティがある場合は、渡すものを見つける必要があります。ここで、または別の方法でスローされる可能性のある例外を処理します。

私はこのようなものを手に入れます:

public object[,] ConvertListToObject<T>(IEnumerable<T> DataSource)
{
    int rows = DataSource.Count();
    //Get array of properties of the type T
    PropertyInfo[] propertyInfos;
    propertyInfos = typeof(T).GetProperties(
        BindingFlags.Public |
        BindingFlags.Instance); // or .Static
    int cols = propertyInfos.Length;
    //Create object array with rows/cols
    object[,] excelarray = new object[rows, cols];
    int i = 0;
    foreach (T data in DataSource) //Outer loop
    {
        for (int j = 0; j < cols; j++) //Inner loop
        {
            excelarray[i, j] = propertyInfos[j].GetValue(data, null);
        }
        i++;
    }
    return excelarray;
}
于 2012-10-03T10:52:52.113 に答える
1
    public object[,] ConvertListToObject<T>(IEnumerable<T> dataSource)
    {
        if (dataSource != null)
        {
            var rows = dataSource.Count();
            var propertyInfos = typeof (T).GetProperties(BindingFlags.Public);
            var cols = propertyInfos.Length;
            var excelarray = new object[rows,cols];
            var i = 0;
            foreach (var data in dataSource)
            {
                for (var j = 0; j < cols; j++)
                {
                    excelarray[i, j] = propertyInfos[j].GetValue(data, null);
                }
                i++;
            }
            return excelarray;
        }
        return new object[,] {};
    }
于 2012-10-03T11:00:48.817 に答える
1

列挙型にインデックスを付けることはできないため、forループを使用するのではなく、カウンターをインクリメントしながらforeachループで列挙する必要があります。

int i = 0;
foreach (var row in DataSource)
{
    for (int j = 0; j < cols; j++)
        excelarray[i,j] = propertyInfos[j].GetValue(row, null);
    i++;
}
于 2012-10-03T10:54:31.673 に答える