如何用反射实现下面的简单东西

wylp_19 2009-04-09 09:41:25
private static void GetDataSet()
{
SqlConnection conn = new SqlConnection(connStr);
conn.Open();
//SqlCommand cmd = new SqlCommand("select * from UserInfo", conn);
SqlDataAdapter da = new SqlDataAdapter("select * from UserInfo", conn);
DataSet ds = new DataSet();
da.Fill(ds);
List<UserInfo> infos = new List<UserInfo>();
UserInfo model = new UserInfo();
ReaderToObject2(dt, model);
infos.Add(model);

conn.Close();

foreach (UserInfo u in infos)
{
Console.WriteLine("ID:{0} 姓名:{1} 年龄:{2} 电话号码:{3}", u.id, u.name, u.age, u.phone);
Console.WriteLine();
}

Console.Read();
}
private static void ReaderToObject2(DataSet ds, object targetObj)
{
for (int i = 0; i < ds.Tables[0].Columns.Count; i++)
{
PropertyInfo property = targetObj.GetType().GetProperty(ds.Tables[0].Columns);
property.SetValue(targetObj, dt.Columns[i].ToString(), null);
}
}

...全文
180 12 打赏 收藏 转发到动态 举报
写回复
用AI写文章
12 条回复
切换为时间正序
请发表友善的回复…
发表回复
zzyzgydotnet 2009-04-10
  • 打赏
  • 举报
回复
顶起来
saisky 2009-04-10
  • 打赏
  • 举报
回复
顶。。
都挺好~
qq2013 2009-04-10
  • 打赏
  • 举报
回复
[Quote=引用 10 楼 Sysping1 的回复:]
加query就更进一步了~~~~~

其实你要实现的都是一些ORM里最基础的功能,下面方法相信可以达到目的!
当然要真正应用于开发,需要你自己进一步完善,比如性能优化方面等!

/// <summary>
/// 根据where条件sql构建泛型对象集合(查询)
/// </summary>
/// <typeparam name="T">泛型 </typeparam>
/// <param name="where">条件sql </…
[/Quote]

ding
Sysping1 2009-04-10
  • 打赏
  • 举报
回复
加query就更进一步了~~~~~

其实你要实现的都是一些ORM里最基础的功能,下面方法相信可以达到目的!
当然要真正应用于开发,需要你自己进一步完善,比如性能优化方面等!

/// <summary>
/// 根据where条件sql构建泛型对象集合(查询)
/// </summary>
/// <typeparam name="T">泛型</typeparam>
/// <param name="where">条件sql</param>
private static List<T> void LoadEntitysFromQuery<T>(string where)
{
//下面实现的前提是:类型名与表名存在明确的对应规则
//下面假定对应规则是:类型名与表名相同
//其实一般类型与表的对应关系是通过Attribute或XML配置做到的.
//可以查阅ORM相关技术
string tblName = typeof(T).Name;//假定类型名与表名相同

string connStr = "你的链接字符串";
SqlConnection conn = new SqlConnection(connStr);
conn.Open();
SqlDataAdapter da = new SqlDataAdapter("select * from " + tblName + where, conn);
DataSet ds = new DataSet();
da.Fill(ds);

//根据DataSet构建泛型对象集合
return GetEntitysFromTbl<T>(ds.Tables[0]);
}

/// <summary>
/// 根据DataSet构建泛型对象集合
/// </summary>
/// <typeparam name="T">泛型</typeparam>
/// <param name="tbl">数据表.</param>
/// <returns>泛型对象集合</returns>
private static List<T> GetEntitysFromTbl<T>(System.Data.DataTable tbl)
{
List<T> entitys = new List<T>(tbl.Rows.Count);
foreach (System.Data.DataRow dataRow in tbl.Rows)
{
T entity = CreateEntityFromRow<T>(dataRow);
entitys.Add(entity);
}

return entitys;
}

/// <summary>
/// 根据一行记录构建泛型对象
/// </summary>
/// <typeparam name="T">泛型</typeparam>
/// <param name="dataRow">DataRow</param>
/// <returns>泛型对象</returns>
private static T CreateEntityFromRow<T>(System.Data.DataRow dataRow)
{
//下面实现的前提是:属性名与字段名存在明确的对应规则
//下面假定对应规则是:字段名称与属性名称相同
//其实一般字段名称与属性的对应关系是通过Attribute或XML配置做到的.
//可以查阅ORM相关技术
T entity = System.Activator.CreateInstance<T>();//动态构建对象
System.Reflection.PropertyInfo[] propertys = typeof(T).GetProperties();//所有属性
foreach (System.Reflection.PropertyInfo property in propertys)
{
object propertyValue = dataRow[property.Name];//假定字段名称与属性名称相同
property.SetValue(entity, propertyValue, null);//对象的属性赋值
}

return entity;
}
duping9626 2009-04-10
  • 打赏
  • 举报
回复
简单示例,详见命名空间System.Reflection中的相关反射类

using System.Reflection;

private void button2_Click(object sender, EventArgs e)
{
SqlConnection con = new SqlConnection();

object[] str = new Object[] { "Data Source=DUPING;Initial Catalog=AdventureWorks;Integrated Security=True" };
//设置ConnectionString属性
con.GetType().InvokeMember("ConnectionString", System.Reflection.BindingFlags.SetProperty , null, con, str);
con.GetType().InvokeMember("Open", System.Reflection.BindingFlags.InvokeMethod , null, con, null);

}
Sysping1 2009-04-09
  • 打赏
  • 举报
回复
其实你要实现的都是一些ORM里最基础的功能,下面方法相信可以达到目的!
当然要真正应用于开发,需要你自己进一步完善,比如性能优化方面等!

/// <summary>
/// 根据DataSet构建泛型对象集合
/// </summary>
/// <typeparam name="T">泛型</typeparam>
/// <param name="tbl">数据表.</param>
/// <returns>泛型对象集合</returns>
private static List<T> GetEntitysFromTbl<T>(System.Data.DataTable tbl)
{
List<T> entitys = new List<T>(tbl.Rows.Count);
foreach (System.Data.DataRow dataRow in tbl.Rows)
{
T entity = CreateEntityFromRow<T>(dataRow);
entitys.Add(entity);
}

return entitys;
}

/// <summary>
/// 根据一行记录构建泛型对象
/// </summary>
/// <typeparam name="T">泛型</typeparam>
/// <param name="dataRow">DataRow</param>
/// <returns>泛型对象</returns>
private static T CreateEntityFromRow<T>(System.Data.DataRow dataRow)
{
//下面实现的前提是:属性名与字段名存在明确的对应规则
//下面假定对应规则是:字段名称与属性名称相同
//其实一般字段名称与属性的对应关系是通过Attribute或XML配置做到的.
//可以查阅ORM相关技术
T entity = System.Activator.CreateInstance<T>();//动态构建对象
System.Reflection.PropertyInfo[] propertys = typeof(T).GetProperties();//所有属性
foreach (System.Reflection.PropertyInfo property in propertys)
{
object propertyValue = dataRow[property.Name];//假定字段名称与属性名称相同
property.SetValue(entity, propertyValue, null);//对象的属性赋值
}

return entity;
}
coodd 2009-04-09
  • 打赏
  • 举报
回复
不是实现了吗
mzjmicrosoft 2009-04-09
  • 打赏
  • 举报
回复
貌似没有这么问的
wylp_19 2009-04-09
  • 打赏
  • 举报
回复
DataSet里的值取出来 通过反射赋值给字段属性返回去在输入字段
wuyq11 2009-04-09
  • 打赏
  • 举报
回复
我姓区不姓区 2009-04-09
  • 打赏
  • 举报
回复
要干嘛?

110,499

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Web++
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧