指引网

当前位置: 主页 > 编程开发 > C >

C#反射,根据反射将数据库查询数据和实体类绑定,并为实体类赋值

来源:网络 作者:佚名 点击: 时间:2017-07-19 23:04
[摘要] 

这是一朋友写的利用c#反射,根据反射将数据库教程查询数据和实体类绑定,并为实体类赋值 代码有需要朋友可以参考一下。

using system;
using system.reflection;
using system.data.sqlclient;
using system.data;
using system.collections.generic;

namespace reflectiondemo
{
#region main
class program
{
static void main(string[] args)
{
dataset ds = new dataset();

#region 连接数据库构建dataset

//sqlconnection con = new sqlconnection("data source=.;initial catalog=myschool;integrated security=true");
//sqldataadapter objadapter = new sqldataadapter("select * from student", con);
//objadapter.fill(ds);

#endregion

#region 手动构建dataset

datatable dt = new datatable();
dt.columns.add("id");
dt.columns.add("name");
datarow row = dt.newrow();
row["id"] = 1;
row["name"] = "灰太狼";
dt.rows.add(row);
ds.tables.add(dt);
#endregion

list<student> students = new list<student>();
foreach (datarow datarow in ds.tables[0].rows)
{
student stu = new student();
utility.converttoentity(stu, row);
students.add(stu);
}
foreach (student student in students)
{
console.writeline(student.name);
}
}
}
#endregion

#region 实体类

/// <summary>
/// 实体类,需要在属性
/// 上添加自定义特性
/// 每个实体类对应数据表里
/// 的一个字段,注意,自定义特性里的参数
/// 一定要和数据表里的字段一一对应,
/// 否则就反射不到了!
/// </summary>
public class student
{
[datacontextattribute("id")]
public int id { get; set; }
[datacontext("name")]
public string name { get; set; }
}

#endregion

#region 自定义特性

/// <summary>
/// 自定义特性
/// </summary>
[attributeusage(attributetargets.property)]
public class datacontextattribute : attribute
{
/// <summary>
/// 自定义特性
/// </summary>
/// <param name="fieldname">数据表字段名称</param>
public datacontextattribute(string property) { this.property = property; }
/// <summary>
/// 数据表字段属性(实体属性)
/// </summary>
public string property { get; set; }
}

#endregion

#region 反射

public class utility
{
/// <summary>
/// 将datarow转换成实体
/// </summary>
/// <param name="obj">实体</param>
/// <param name="row">数据表一行数据</param>
public static void converttoentity(object obj, datarow row)
{
///得到obj的类型
type type = obj.gettype();
///返回这个类型的所有公共属性
propertyinfo[] infos = type.getproperties();
///循环公共属性数组
foreach (propertyinfo info in infos)
{
///返回自定义属性数组
object[] attributes = info.getcustomattributes(typeof(datacontextattribute), false);
///将自定义属性数组循环
foreach (datacontextattribute attribute in attributes)
{
///如果datarow里也包括此列
if (row.table.columns.contains(attribute.property))
{
///将datarow指定列的值赋给value
object value = row[attribute.property];
///如果value为null则返回
if (value == dbnull.value) continue;
///将值做转换
if (info.propertytype.equals(typeof(string)))
{
value = row[attribute.property].tostring();
}
else if (info.propertytype.equals(typeof(int)))
{
value = convert.toint32(row[attribute.property]);
}
else if (info.propertytype.equals(typeof(decimal)))
{
value = convert.todecimal(row[attribute.property]);
}
else if (info.propertytype.equals(typeof(datetime)))
{
value = convert.todatetime(row[attribute.property]);
}
else if (info.propertytype.equals(typeof(double)))
{
value = convert.todouble(row[attribute.property]);
}
else if (info.propertytype.equals(typeof(bool)))
{
value = convert.toboolean(row[attribute.property]);
}
///利用反射自动将value赋值给obj的相应公共属性
info.setvalue(obj, value, null);
}
}
}
}
}

#endregion
}

/****************数据库脚本***************
* create database myschool
* go
* use myschool
* go
* create table student
* (
* id int identity primary key,
* name varchar(10)
* )
* ****************************************/

------分隔线----------------------------