拡張メソッドを使用して DataTable に自動的に変換するクラスのジェネリック リストがあります。今度Reflection
は逆方向に変換したいDataTable
と思います。List に変換したいと思います。DataTable
そして、Type
列名に従ってそのタイプ(クラス)のプロパティを自動的に見つけ、そのタイプ(クラス)のオブジェクトに値を割り当てます。このpsoduコードのように:
private List<T> ConvertToList<T>(DataTable dt)
{
List<string> AllColumns = // Get All Column Names of a DataTable
for(int i=0;i<dt.Rows.Count;i++)
{
foreach(var item in AllColumns )
{
//Get Property According To **ITEM**
//Get Data Of Rows[i][item] and assign it to T.property
}
}
}
どうすればこれを行うことができますか?
編集1)
@Cuong Le の回答を次のように使用します。
var properties = typeof(CustomType).GetProperties().ToList();
List<CustomType> list = ConvertToList<CustomType>(dt, properties);
と :
private List<T> ConvertToList<T>(DataTable dt,List<PropertyInfo> fields) where T : class
{
return dt.AsEnumerable().Select(Convert<T>(fields)).ToList(); <------
}
private T Convert<T>(DataRow row,List<PropertyInfo> fields) where T : class
{
var properties = typeof(T).GetProperties().ToList();
var objT = Activator.CreateInstance<T>();
foreach (var pro in properties)
{
pro.SetValue(objT, row[pro.Name],null);
}
return objT;
}
しかし、行の前に矢印を配置すると、次の2つのエラーが発生しました。
メソッド 'Convert' のオーバーロードは 1 つの引数を取らない
と
メソッド 'System.Data.EnumerableRowCollectionExtensions.Select(System.Data.EnumerableRowCollection, System.Func)' の型引数は、使用法から推測できません。型引数を明示的に指定してみてください。
どうすればこの問題を解決できますか?