最新下载
热门教程
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
C#反射,根据反射将数据库查询数据和实体类绑定,并为实体类赋值
时间:2022-06-25 05:00:19 编辑:袖梨 来源:一聚教程网
这是一朋友写的利用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);
#endregionlist
students = new list ();
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 实体类
///
/// 实体类,需要在属性
/// 上添加自定义特性
/// 每个实体类对应数据表里
/// 的一个字段,注意,自定义特性里的参数
/// 一定要和数据表里的字段一一对应,
/// 否则就反射不到了!
///
public class student
{
[datacontextattribute("id")]
public int id { get; set; }
[datacontext("name")]
public string name { get; set; }
}#endregion
#region 自定义特性
///
/// 自定义特性
///
[attributeusage(attributetargets.property)]
public class datacontextattribute : attribute
{
///
/// 自定义特性
///
/// 数据表字段名称
public datacontextattribute(string property) { this.property = property; }
///
/// 数据表字段属性(实体属性)
///
public string property { get; set; }
}#endregion
#region 反射
public class utility
{
///
/// 将datarow转换成实体
///
/// 实体
/// 数据表一行数据
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)
* )
* ****************************************/
相关文章
- 《燕云十六声》红尘无眼完成图文攻略 12-25
- 《燕云十六声》阴阳如影完成图文攻略 12-25
- 《燕云十六声》悬檐之下四架椽屋图文攻略 12-25
- 《燕云十六声》2024最新公测时间介绍 12-25
- 《燕云十六声》有没有藏宝阁 12-25
- 《燕云十六声》制作公司介绍 12-25