博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Net特性与反射 DEMO
阅读量:5041 次
发布时间:2019-06-12

本文共 4630 字,大约阅读时间需要 15 分钟。

 

对于特性与反射的一些基本知识可以参考MSDN:

下面利用反射与特性做了一个关于实现DataTable与实体之间的相互转化的Demo.

实体类 Author:

public partial class Author
{
public Author()
{ }
#region Model
private int _id;
private string _title;
private string _content;
private string _email;
private string _sex;
/// 
///
/// 
[DataFiled("Id", SqlDbType.Int)]
public int Id
{
set { _id = value; }
get { return _id; }
}
/// 
///
/// 
[DataFiled("Title", SqlDbType.VarChar)]
public string Title
{
set { _title = value; }
get { return _title; }
}
/// 
///
/// 
[DataFiled("Content", SqlDbType.VarChar)]
public string Content
{
set { _content = value; }
get { return _content; }
}
/// 
///
/// 
[DataFiled("Email", SqlDbType.VarChar)]
public string Email
{
set { _email = value; }
get { return _email; }
}
/// 
///
/// 
[DataFiled("Sex", SqlDbType.VarChar)]
public string Sex
{
set { _sex = value; }
get { return _sex; }
}
#endregion Model
 
}

自定义特性类DataFiledAttribute和NoDataFiledAttribute类:

[AttributeUsage(AttributeTargets.All, AllowMultiple = true)]
public class DataFiledAttribute : Attribute
{
private string name;
private SqlDbType paramType;
private int size;
/// 
///
/// 
public string FieldName
{
get { return this.name == null ? string.Empty : this.name; }
set { this.name = value; }
}
 
public SqlDbType SqlDbType
{
get { return this.paramType; }
set { this.paramType = value; }
}
 
public int Size
{
get { return this.size; }
set { this.size = value; }
}
 
public bool IsSizeDefined
{
get { return size != 0; }
}
 
public DataFiledAttribute(string strFieldName, SqlDbType sdtSqlDbType, int iSize)
{
this.name = strFieldName;
this.paramType = sdtSqlDbType;
this.size = iSize;
}
 
public DataFiledAttribute(string strFieldName, SqlDbType sdtSqlDbType)
: this(strFieldName, sdtSqlDbType, 0)
{
 
}
 
}
[AttributeUsage(AttributeTargets.All, AllowMultiple = true)]
public class NoDataFiledAttribute : Attribute { }

下面的是实现转化的类了微笑

public class ModelHandler
{ ///
/// 实体列表转为DataTable 注意:使用本方法,须要实体中的每个属性必须添加DataFieldAttribute特性 /// ///
实体列表 ///
返回DataTable
public static System.Data.DataTable Model2DataTable(List
objlist) { if (objlist.Count == 0) return null; DataTable dt = GeneratorDataTable(typeof(T)); foreach (T obj in objlist) { Type modelType = obj.GetType(); PropertyInfo[] properties = modelType.GetProperties(); DataRow dr = dt.NewRow(); for (int i = 0; i < properties.Length; i++) { dr[i] = properties[i].GetGetMethod().Invoke(obj, null); } dt.Rows.Add(dr); } return dt; } private static DataTable GeneratorDataTable(Type modelType) { //Type modelType = obj.GetType(); PropertyInfo[] properties = modelType.GetProperties(); DataFiledAttribute d = null; DataTable dt = new DataTable(); for (int i = 0; i < properties.Length; i++) { DataColumn dc = new DataColumn(); d = Attribute.GetCustomAttribute(properties[i], typeof(DataFiledAttribute)) as DataFiledAttribute; dc.ColumnName = d.FieldName; dc.DataType = typeof(string); dt.Columns.Add(dc); } return dt; } ///
/// DataTable转为实体列表 /// ///
///
public static List
DataTable2Model(DataTable dt) { if (dt.Rows.Count == 0) { return null; } List
list = new List
(); foreach (DataRow dr in dt.Rows) { T obj = Activator.CreateInstance
(); foreach (DataColumn dc in dt.Columns) { PropertyInfo info = obj.GetType().GetProperty(dc.ColumnName); Type t = info.PropertyType; info.SetValue(obj, Convert.ChangeType(dr[dc], t), null); } list.Add(obj); } return list; } }

具体实现如下:

Author model = new Author();            model.Id = 1;            model.Title = "test";            model.Content = null;            List
list = new List
(); list.Add(model); DataTable dt = ModelHandler
.Model2DataTable(list); List
list1 = new List
(); list1 = ModelHandler
.DataTable2Model(dt);

查看一下结果:

   DataTable:

  list<model>:

转载于:https://www.cnblogs.com/guolihao/archive/2013/01/17/2863954.html

你可能感兴趣的文章
国外媒体推荐的5款当地Passbook通行证制作工具
查看>>
日常报错
查看>>
list-style-type -- 定义列表样式
查看>>
hibernate生成表时,有的表可以生成,有的却不可以 2014-03-21 21:28 244人阅读 ...
查看>>
mysql-1045(28000)错误
查看>>
Ubuntu 编译出现 ISO C++ 2011 不支持的解决办法
查看>>
1.jstl c 标签实现判断功能
查看>>
Linux 常用命令——cat, tac, nl, more, less, head, tail, od
查看>>
超详细的Guava RateLimiter限流原理解析
查看>>
VueJS ElementUI el-table 的 formatter 和 scope template 不能同时存在
查看>>
Halcon一日一练:图像拼接技术
查看>>
Swift - RotateView
查看>>
iOS设计模式 - 中介者
查看>>
centos jdk 下载
查看>>
HDU 1028 Ignatius and the Princess III(母函数)
查看>>
(转)面向对象最核心的机制——动态绑定(多态)
查看>>
token简单的使用流程。
查看>>
django创建项目流程
查看>>
UIActionSheet 修改字体颜色
查看>>
Vue 框架-01- 入门篇 图文教程
查看>>