c# 类型拷贝
/// <summary>
/// 类 名:EntityHelper
/// 类 说 明:实体操作方法类
/// :
/// 创建时间:2013/8/12
/// </summary>
public static class EntityHelper
{
/// <summary>
/// 方 法 名:DataRowToEntity
/// 方法说明:转化数据行到实体对象
/// :
/// 创建时间:2013/8/12
/// </summary>
/// <typeparam name="T">实体类型</typeparam>
/// <param name="dr">数据行</param>
/// <param name="excludefields">不进行赋值的字段</param>
/// <returns>实体对象</returns>
public static T DataRowToEntity<T>(DataRow dr, string excludefields) where T : new()
{
Type t = typeof(T);
PropertyInfo[] pinfos = t.GetProperties();
T obj = new T();
foreach (PropertyInfo pi in pinfos)
{
if (!dr.Table.Columns.Contains(pi.Name))
continue;
if (!string.IsNullOrWhiteSpace(excludefields) && excludefields.Contains(pi.Name))
continue;
if (dr[pi.Name] != DBNull.Value)
pi.SetValue(obj, dr[pi.Name], null);
else
pi.SetValue(obj, null, null);
}
return obj;
}
/// <summary>
/// 方 法 名:DataRowToEntity
/// 方法说明:转化数据行到实体对象
/// :
/// 创建时间:2013/8/12
/// </summary>
/// <typeparam name="T">实体类型</typeparam>
/// <param name="dr">The dr.</param>
/// <returns></returns>
public static T DataRowToEntity<T>(DataRow dr) where T : new()
{
return DataRowToEntity<T>(dr, string.Empty);
}
/// <summary>
/// 方 法 名:DataTableToEntityList
/// 方法说明:转化数据行到实体对象
/// :
/// 创建时间:2013/8/12
/// </summary>
/// <typeparam name="T">实体类</typeparam>
/// <param name="dt">数据表</param>
/// <returns></returns>
public static List<T> DataTableToEntityList<T>(DataTable dt) where T : new()
{
return DataTableToEntityList<T>(dt,null);
}
/// <summary>
/// 方 法 名:DataTableToEntityList
/// 方法说明:转化数据行到实体对象
/// :
/// 创建时间:2013/8/12
/// </summary>
/// <typeparam name="T">实体类</typeparam>
/// <param name="dt">数据表</param>
/// <param name="excludefields">不进行赋值的字段</param>
/// <returns></returns>
public static List<T> DataTableToEntityList<T>(DataTable dt,string excludefields) where T : new()
{
List<T> list = new List<T>();
if (dt != null)
{
foreach (DataRow dr in dt.Rows)
{
T t = DataRowToEntity<T>(dr,excludefields);
if (t != null)
list.Add(t);
}
}
return list;
}
/// <summary>
/// 复制实体
/// </summary>
/// <typeparam name="T"></typeparam>
/// <param name="source"></param>
/// <returns></returns>
public static T CopyEntity<T>(T source) where T : new()
{
Type t = typeof(T);
PropertyInfo[] pinfos = t.GetProperties();
T obj = new T();
foreach (PropertyInfo pi in pinfos)
{
object v = GetMemberValue(source,pi);
pi.SetValue(obj, v, null);
}
return obj;
}
/// <summary>
/// 判断两个实体是否一样
/// </summary>
/// <param name="source"></param>
/// <param name="dest"></param>
/// <returns></returns>
public static bool CheckEntityEquals(object source, object dest)
{
Type t = source.GetType();
PropertyInfo[] pinfos = t.GetProperties();
foreach (PropertyInfo pi in pinfos)
{
object v1 = GetMemberValue(dest, pi);
object v = GetMemberValue(source, pi);
if (!object.Equals(v1, v))
return false;
}
return true;
}
/// <summary>
/// 方法说明:获取实体成员的值
/// 作 者:
/// 创建时间:2013/9/14
/// </summary>
/// <param name="entity">实体</param>
/// <param name="member">实体成员信息</param>
/// <returns>实体成员的值</returns>
public static object GetMemberValue(object entity, MemberInfo member)
{
if ((entity == null) || (member == null))
{
return null;
}
object value = null;
switch (member.MemberType)
{
case MemberTypes.Field:
FieldInfo field = member as FieldInfo;
if (field != null)
{
value = field.GetValue(entity);
}
break;
case MemberTypes.Property:
PropertyInfo property = member as PropertyInfo;
if (property != null)
{
value = property.GetValue(entity, null);
}
break;
default:
break;
}
return value;
}
/// <summary>
/// 方法说明:获取实体成员的值
/// 作 者:
/// 创建时间:2013/9/14
/// </summary>
/// <param name="entity">实体</param>
/// <param name="memberName">实体成员名称</param>
/// <param name="ignoreCase">是否忽略大小写</param>
/// <returns>实体成员的值</returns>
public static object GetMemberValue(object entity, string memberName, bool ignoreCase)
{
if ((entity == null) || (string.IsNullOrEmpty(memberName)))
{
return null;
}
MemberInfo[] members;
if (ignoreCase)
{
members = entity.GetType().GetMember(memberName, BindingFlags.Public | BindingFlags.IgnoreCase | BindingFlags.Instance);
}
else
{
members = entity.GetType().GetMember(memberName);
}
if ((members == null) || (members.Length == 0))
{
return null;
}
return GetMemberValue(entity, members[0]);
}
public static void SetMemberValue(object entity, string memberName, object memberValue)
{
if ((entity == null) || (string.IsNullOrEmpty(memberName)))
{
return;
}
MemberInfo[] members;
members = entity.GetType().GetMember(memberName, BindingFlags.Public | BindingFlags.IgnoreCase | BindingFlags.Instance);
if ((members == null) || (members.Length == 0))
{
return;
}
if (members[0] is FieldInfo)
{
if (memberValue == DBNull.Value)
(members[0] as FieldInfo).SetValue(entity, null);
else
(members[0] as FieldInfo).SetValue(entity, memberValue);
}
else if (members[0] is PropertyInfo)
{
if (memberValue == DBNull.Value)
(members[0] as PropertyInfo).SetValue(entity, null, null);
else
(members[0] as PropertyInfo).SetValue(entity, memberValue,null);
}
}
}
}
c# 类型拷贝的更多相关文章
- 5.decltype类型拷贝
#include <iostream> using namespace std; template <class T> void show(T *p) { //初始化 decl ...
- Marshal.Copy将指针拷贝给数组
lpStatuss是一个UNITSTATUS*的指针类型实例,并包含SensorDust字段 //定义一个数组类型 byte[] SensorDust = new byte[30] //将指针类型拷贝 ...
- JAVA-Clone 对象拷贝
JAVA 中对象的赋值是复制对象的引用,即复制引用 public static void main(String[] args) { User user = new User(1,"asds ...
- C/C++:copy control (拷贝控制)
前言:当定义一个类的时候,我们显示或者隐式地指定在此类型的对象拷贝,移动,赋值,销毁时做些什么,一个类通过定义五种特殊的成员函数来控制这些操作,包括拷贝构造函数,拷贝赋值运算符,移动构造函数,移动赋值 ...
- Go语言基础之9--指针类型详解
一. 变量和内存地址 每个变量都有内存地址,可以说通过变量来操作对应大小的内存 注意:通过&符号可以获取变量的内存地址 通过下面例子来理解下: 实例1-1 package main impor ...
- Java中对象拷贝的两种方式
引用的拷贝 //引用拷贝 private static void copyReferenceObject(){ Person p = new Person(23, "zhang") ...
- Day 07 -02 拷贝 浅拷贝 深拷贝
必考 存一个值还是多个值 一个值:整型/浮点型/字符串 多个值:列表/元祖/字典/集合 有序or 无序 有序:字符串/列表/元祖 无序:字典/集合 可变or 不可变 可变:列表/字典/集合 不可变:整 ...
- Objective-C之深浅拷贝
深拷贝(指针和指向都改变) , 浅拷贝(指针改变,指向不变) NSString *s1 = @"string"; NSLog(@"s1 : %p, %p, %@" ...
- UnrealScript语言基础
总体特征 (1)大小写不敏感.关键字.宏.变量名.函数名以及类名不区分大小写:变量名可以与关键字同名 (2)局部变量.成员变量未初始化时,会被编译器初始化 (3)没有全局变量.全局函数,所有东西必须写 ...
随机推荐
- 《Effective C++》第三版笔记
阅读此笔记前,请先阅读 <Effective C++>第二版笔记 和 <More Effective C++>笔记 这里只记录与上面笔记不同的条款,主要是 "面对 ...
- POJ 1925 Spiderman
Spiderman Time Limit: 5000MS Memory Limit: 65536K Total Submissions: 5858 Accepted: 1143 Description ...
- PHP读取word文档
在PHP中读取和写入WORD文档的代码 <? php // 建立一个指向新COM组件的索引 $word = new COM(”word.application”) or die(”Can't s ...
- cocos2d-x多分辨率适配方案:setDesignResolutionSize使用
1. setDesignResolutionSize使用方法及主要的三种适配模式 在cocos2d-x 2.0里,提供了一个叫做setDesignResolutionSize的方法,直接一次设置就可以 ...
- c语言小知识点
大一时学c语言,总结的一些自己感觉很零碎且容易忘的知识点,不对之处请指正 1.字符串不管中间是否有数值0,结尾一定有数值02.浮点类型的变量存储并不精确3.printf格式串自动右对齐,加负号左对齐4 ...
- MAC地址,使用java获取IP地址和MAC地址。
MAC地址,通常在http连接的项目中,来区分唯一客户端. MAC:六组十六进制字符组成. 如:E0-3F-49-AB-DB-EB IP:四组八位的二进制字符组成. 如:10.6.62.244 /** ...
- 内网安全工具之hscan扫描
工具下载地址:hscan1.2.zip 界面简单,看配置: 这里我们主要需要配置的是模块和参数 模块,按照默认配置就行,取消 check HTTP vulnerability(漏洞检测) 会更快一点. ...
- 2016年10月31日--网页 Windows对象操作
Window.opener:打开当前窗口的源窗口,如果当前窗口是首次启动浏览器打开的,则opener是null. Window.open(URL,name,features,replace):open ...
- Vijos P1769 网络的关键边
Description 一个连通的无向图,有些点有A属性,有些点有B属性,可以同时具有.删掉某条边后,如果使得连通块中一些点不具有A,B属性的点,求这些边. Sol Tarjan求割边. 首先这些边一 ...
- COGS 2434 暗之链锁 题解
[题意] 给出一个有n个点的无向图,其中有n-1条主要边且这些主要边构成一棵树,此外还有m条其他边,求斩断原图的一条主要边和一条其他边使得图不连通的方案数. 注意,即使只斩断主要边就可以使得原图不连通 ...