ジェネリックを受け入れList<T>
、Excel ファイルを返すリストを反復処理する関数を作成しようとしていますbyte[]
。関数は、オブジェクトのプロパティを決定できる必要があります。したがって、私が a を渡し、List<person>
人が最初、最後、年齢などのプロパティを持っている場合、Excel 列ヘッダーを作成するためにプロパティ名を決定できる必要があり、次にリストを繰り返してプロパティ値を列に割り当てる必要があります細胞。List<T>
ジェネリック関数で作業するためのサンプルコードを教えてもらえますか?
3 に答える
余談: 既知の順序で列を取得する場合:作成した順序を除いて、メンバーの順序は定義されていません。例(MSDNから):
GetProperties メソッドは、アルファベット順や宣言順など、特定の順序でプロパティを返しません。プロパティが返される順序はさまざまであるため、コードはプロパティが返される順序に依存してはなりません。
順序に依存する必要がない場合は、リフレクションまたは TypeDescriptor で十分です。たとえば(これはTSVテキストではなく、TSVテキストを書き込むことに注意してくださいbyte[]
-私の解釈では、問題はデータを取得することであり、Excelを書き込むことではありません):
static void WriteTsv<T>(this IEnumerable<T> data, TextWriter output)
{
PropertyDescriptorCollection props = TypeDescriptor.GetProperties(typeof(T));
foreach (PropertyDescriptor prop in props)
{
output.Write(prop.DisplayName); // header
output.Write("\t");
}
output.WriteLine();
foreach (T item in data)
{
foreach (PropertyDescriptor prop in props)
{
output.Write(prop.Converter.ConvertToString(
prop.GetValue(item)));
output.Write("\t");
}
output.WriteLine();
}
}
注文が必要な場合は、次のいずれかが必要です。
- それを渡します(たとえば、として
params string[] propertyNames
) - プロパティで属性を使用する
- アルファベット順を使用
上記のアプローチには、( よりも) 次TypeDescriptor
のような利点があります。GetType().GetProperties()
- カスタム オブジェクト モデルで動作します (
DataView
たとえば、 を使用する場合IList
) 。 - パフォーマンスのために実装を微調整できます-たとえば、HyperDescriptor (これをたくさん実行している場合に役立ちます)
おそらく最も簡単な方法は、List を DataTableに変換してから、DataTable を Excel スプレッドシートに変換することです。
2 番目のリンクは、スプレッドシートを直接 ASP.NET 応答に書き込みます。これは、byte[] を返すように簡単に変更できます。
次のような、コレクションでサポートされているインターフェイスを使用しますIEnumerable
。
public byte[] Process(IEnumerable input) {
foreach (var elem in input) {
foreach (PropertyInfo prop in elem.GetType().GetProperties()) {
Object value = prop.GetValue(elem, null);
// add value to byte[]
}
}
return bytes;
}