列IDに基づいてSqlDataReader
からいくつかの種類のフィールドを読んでいます。私はList
のフィールドを取得する汎用関数を記述しようとしました。SqlDataReaderの汎用リストを入力してください
private static List<T> GetSqlFields<T>(SqlDataReader reader, int columnId)
{
var fields = new List<T>();
while (reader.Read())
{
T f = reader.Get... // Problem is here
fields.Add(f);
}
return fields;
}
問題は、私が唯一の方法GetString
を、見ているGetInt32
、など。T
に基づいてフィールドを取得する方法はありますか?ありがとうございました。
私は書くことができるようにするためにこれをやっている:
int fooColumnId = reader.GetOrdinal("Foo");
int barColumnId = reader.GetOrdinal("Baar");
List<string> foos = GetSqlFields<string>(reader, fooColumnId);
List<int> baars = GetSqlFields<int>(reader, barColumnId);
int fooColumnId =(int)reader ["Foo"]; \t \t int barColumnId =(int)reader ["Bar"]; – CodeConstruct
'.GetValue()'に変換し、 'Convert'を通してそれをパイプすることができます(あるいは、ユーザが決してミスをしないと思うなら' T'にハードキャストしてください)。それを越えて、あなたがボクシングを避けたいならば、あなたは 'Type.GetTypeCode(typeof(T))'に大胆な 'switch'を必要とします。または、より良いことに、ホイールを再開発せず、Dapper(または別のマイクロORM)を使用して、内部ループを最適化しています。 –
@ JeroenMostert:ジェネリックな 'GetFieldValue'がありますので、大きなお尻スイッチ(https://xkcd.com/37/)や' Convert'やサードパーティのツールを使う必要はありません。 – Chris