您的位置:首页 > 编程语言 > C#

C#利用委托反射将DataTable转换为实体集

2013-03-13 18:02 375 查看


C#利用委托反射将DataTable转换为实体集

2012-04-19  来自:CNBLOGS  字体大小:【大 中 小】

摘要:本文介绍C#利用委托反射将DataTable转换为实体集,并提供详细的示例代码供参考。

类泛型的约束:
public static class ToModel<T> where T : class, new()
定义委托:
public delegate void SetString(string value);
创建委托方法:
private static SetString CreateStringDelegate(T model, string propertyName)

{

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

Type type = typeof(SetString);

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

}
利用反射和委托将DataTable转换为实体集:
public static IList<T> GetDelegate_ToModelList(DataTable dt)

{

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

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

SetString setDelegateString;

foreach (DataRow dr in dt.Rows)

{

T model = new T();

foreach (DataColumn dc in dt.Columns)

{

setDelegateString = CreateStringDelegate(model, dc.ColumnName);

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

}

list.Add(model);

}

return list;

}
这样写问题就来了,因为委托定义的参数时string类型的,因为我们实体中可能有int或者DateTime类型的,这时就需要用上泛型委托了

如果这样定义委托:

public delegate void SetString<PT>(PT value)
创建委托方法(这里有问题,不知如何处理):
private static SetString CreateStringDelegate(T model, string propertyName)

{

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

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

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

}
利用反射和委托将DataTable转换为实体集:
public static IList<T> GetDelegate_ToModelList(DataTable dt)

{

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

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

foreach (DataRow dr in dt.Rows)

{

T model = new T();

foreach (DataColumn dc in dt.Columns)

{

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

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

}

list.Add(model);

}

return list;

}

作者:cmsdn
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  委托 C#