委任反射によるDataTableのソリッドセットへの変換

8116 ワード

クラス汎用制約:
1 public static class ToModel<T> where T : class, new()

委任の定義:
1 public delegate void SetString(string value);

委任メソッドの作成:
1 private static SetString CreateStringDelegate(T model, string propertyName)

2 {

3    MethodInfo mi = model.GetType().GetProperty(propertyName).GetSetMethod();

4    Type type = typeof(SetString);

5    return Delegate.CreateDelegate(type, model, mi) as SetString;

6  }

反射と委任を使用して、DataTableをエンティティセットに変換します.
 1         public static IList<T> GetDelegate_ToModelList(DataTable dt)

 2         {

 3             IList<T> list = new List<T>();

 4             if (dt == null || dt.Rows.Count < 1) return list;

 5             SetString setDelegateString;

 6             foreach (DataRow dr in dt.Rows)

 7             {

 8                 T model = new T();

 9                 foreach (DataColumn dc in dt.Columns)

10                 {

11                     setDelegateString = CreateStringDelegate(model, dc.ColumnName);

12                     setDelegateString(dr[dc.ColumnName].ToString());

13                 }

14                 list.Add(model);

15             }

16             return list;

17         }

このように問題を書くのは、定義されたパラメータを依頼するときにstringタイプがあるため、私たちのエンティティにintやDateTimeタイプがある可能性があるため、汎用的な依頼が必要です.
委任を定義する場合は、次の手順に従います.
1 public delegate void SetString<PT>(PT value)

委任メソッドの作成(ここで問題があり、どのように処理するか分かりません):
1         private static SetString CreateStringDelegate(T model, string propertyName)

2         {

3             MethodInfo mi = model.GetType().GetProperty(propertyName).GetSetMethod();

4             Type type = typeof(model).GetProperty(propertyName).PropertyType;

5             return Delegate.CreateDelegate(type, model, mi) as SetString<type>;

6         }

反射と委任を使用して、DataTableをエンティティセットに変換します.
 1         public static IList<T> GetDelegate_ToModelList(DataTable dt)

 2         {

 3             IList<T> list = new List<T>();

 4             if (dt == null || dt.Rows.Count < 1) return list;

 5             foreach (DataRow dr in dt.Rows)

 6             {

 7                 T model = new T();

 8                 foreach (DataColumn dc in dt.Columns)

 9                 {

10                     SetString<typeof(T).GetProperty(dc.ColumnName).PropertyType> setDelegateString = CreateStringDelegate(model, dc.ColumnName);

11                     setDelegateString(dr[dc.ColumnName].ToString());

12                 }

13                 list.Add(model);

14             }

15             return list;

16         }

ずっと疑問に思って、誰かが私に疑問を解決してくれることを望んで、直接反射する方法は私もありますが、この問題は解決しないで、心の中はずっとしこりがあって、誰かが助けてくれることを望んで、ありがとうございます!