MysqlHelper使用反射机制智能推算数据类型以及属性名称
public class MySqlHelper
{
private string ConnString; public MySqlHelper(string connectionString)
{
ConnString = connectionString;
}
public IList<T> RunMySqlSelect4ReturnList<T>(string strCommand) where T : new()
{ MySqlCommand mySqlCommand = new MySqlCommand();
mySqlCommand.CommandText = strCommand.ToString();
IList<PropertyInfo> ilPropertyInfo = typeof(T).GetProperties().ToList(); //p[0].Name =travel_id;
IList<T> ilResult = new List<T>(); DataTable dt = new DataTable();
using (MySqlConnection conn = new MySqlConnection(this.ConnString))
{
conn.Open();
using (MySqlCommand cmd = mySqlCommand)
{
cmd.Connection = conn;
using (MySqlDataReader rdr = cmd.ExecuteReader(CommandBehavior.SequentialAccess))
{
dt.Load(rdr);
}
}
} foreach (DataRow dr in dt.Rows)
{
T tItem = new T();
foreach (var v in ilPropertyInfo)
{
if (dt.Columns[v.Name] == null) continue;
ConvertionExtensions.SetValue(tItem, v.Name, dr[v.Name]);
}
ilResult.Add(tItem);
}
return ilResult;
}
public T getSinggleObj<T>(string strCommand) where T : new()
{ MySqlCommand mySqlCommand = new MySqlCommand();
mySqlCommand.CommandText = strCommand.ToString();
IList<PropertyInfo> ilPropertyInfo = typeof(T).GetProperties().ToList(); //p[0].Name =travel_id;
T ilResult = new T(); DataTable dt = new DataTable();
using (MySqlConnection conn = new MySqlConnection(this.ConnString))
{
conn.Open();
using (MySqlCommand cmd = mySqlCommand)
{
cmd.Connection = conn;
using (MySqlDataReader rdr = cmd.ExecuteReader(CommandBehavior.SequentialAccess))
{
dt.Load(rdr);
}
}
}
if (dt.Rows.Count <= )
{
return default(T);
}
else
{
foreach (DataRow dr in dt.Rows)
{
T tItem = new T();
foreach (var v in ilPropertyInfo)
{
if (dt.Columns[v.Name] == null) continue;
ConvertionExtensions.SetValue(tItem, v.Name, dr[v.Name]);
}
ilResult = tItem;
}
}
return ilResult;
}
public IList<T> RunMySqlSelect4ReturnList<T>(DataTable dts) where T : new()
{ IList<PropertyInfo> ilPropertyInfo = typeof(T).GetProperties().ToList(); //p[0].Name =travel_id;
IList<T> ilResult = new List<T>(); DataTable dt = dts; foreach (DataRow dr in dt.Rows)
{
T tItem = new T();
foreach (var v in ilPropertyInfo)
{
if (dt.Columns[v.Name] == null) continue;
ConvertionExtensions.SetValue(tItem, v.Name, dr[v.Name]);
}
ilResult.Add(tItem);
}
return ilResult;
}
}
public static class ConvertionExtensions
{
public static T ConvertTo<T>(this IConvertible convertibleValue)
{
var t = typeof(T);
if (null == convertibleValue)
{
return default(T);
}
if (!typeof(T).IsGenericType)
{
return (T)Convert.ChangeType(convertibleValue, typeof(T));
}
else
{
Type genericTypeDefinition = typeof(T).GetGenericTypeDefinition();
if (genericTypeDefinition == typeof(Nullable<>))
{
return (T)Convert.ChangeType(convertibleValue, Nullable.GetUnderlyingType(typeof(T)));
}
}
throw new InvalidCastException(string.Format("Invalid cast from type \"{0}\" to type \"{1}\".", convertibleValue.GetType().FullName, typeof(T).FullName));
} public static void SetValue(object inputObject, string propertyName, object propertyVal)
{
//find out the type
Type type = inputObject.GetType(); //get the property information based on the type
System.Reflection.PropertyInfo propertyInfo = type.GetProperty(propertyName); //find the property type
Type propertyType = propertyInfo.PropertyType; //Convert.ChangeType does not handle conversion to nullable types
//if the property type is nullable, we need to get the underlying type of the property
var targetType = IsNullableType(propertyInfo.PropertyType) ? Nullable.GetUnderlyingType(propertyInfo.PropertyType) : propertyInfo.PropertyType; //Returns an System.Object with the specified System.Type and whose value is
//equivalent to the specified object.
propertyVal = Convert.ChangeType(propertyVal, targetType); //Set the value of the property
propertyInfo.SetValue(inputObject, propertyVal, null); } private static bool IsNullableType(Type type)
{
return type.IsGenericType && type.GetGenericTypeDefinition().Equals(typeof(Nullable<>));
} }
MysqlHelper使用反射机制智能推算数据类型以及属性名称的更多相关文章
- 通过java反射机制,获取对象的属性和值(包括所有继承的父类)
java的反射机制提供了两种方法: getDeclaredFields() :该方法能获取到本类的所有属性,包括private,protected和public,但不能获取到继承的父类的属性. get ...
- 浅谈Java反射机制 之 使用类的 属性、方法和构造函数
前面两篇我们总结了Java反射机制如何获取类的字节码,如何获取构造函数,属性和方法, 这篇我们将进一步验证如何使用我们获取到的属性.方法以及构造函数 1.使用 反射 获取到的 属性 import ja ...
- Android : 反射机制获取或设置系统属性(SystemProperties)【转】
本文转载自:https://blog.csdn.net/wei_lei/article/details/70312512 Android.os.SystemProperties 提供了获取和设置系统属 ...
- C#利用反射机制,获取实例的属性和属性值
C#利用反射,遍历获得一个类的所有属性名,以及该类的实例的所有属性的值 对应某个类的实例化的对象tc, 遍历获取所有属性(子成员)的方法(采用反射): Type t = tc.GetType();// ...
- 【java】解析java类加载与反射机制
目录结构: contents structure [+] 类的加载.连接和初始化 类的加载 类的连接 类的初始化 类加载器 类加载器机制 自定义类加载器 URLClassLoader类 反射的常规操作 ...
- Android反射机制:手把手教你实现反射
什么是反射机制? JAVA反射机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法:对于任意一个对象,都能够调用它的任意一个方法和属性:这种动态获取的信息以及动态调用对象的方法的功能称 ...
- 面试题思考:什么是 Java 的反射机制
一.反射机制概述 Java 反射机制是在运行状态中,对于任意一个类,都能够获得这个类的所有属性和方法,对于任意一个对象都能够调用它的任意一个属性和方法.这种在运行时动态的获取信息以及动态调用对象的方法 ...
- 面试题之------Java 反射机制
一.反射机制概述 Java 反射机制是在运行状态中,对于任意一个类,都能够获得这个类的所有属性和方法,对于任意一个对象都能够调用它的任意一个属性和方法.这种在运行时动态的获取信息以及动态调用对象的方法 ...
- 【Java基础】java中的反射机制与动态代理
一.java中的反射机制 java反射的官方定义:在运行状态下,可以获取任意一个类的所有属性和方法,并且可通过某类任意一对象实例调用该类的所有方法.这种动态获取类的信息及动态调用类中方法的功能称为ja ...
随机推荐
- Java API学习(一) ArrayList源码学习
ArrayList在平常用的还挺多的,用起来十分舒服,顺手.这里来学习一下它的源码. 类定义 下面是类的定义: public class ArrayList<E> extends Abst ...
- Java编程的逻辑 (39) - 剖析LinkedList
本系列文章经补充和完善,已修订整理成书<Java编程的逻辑>,由机械工业出版社华章分社出版,于2018年1月上市热销,读者好评如潮!各大网店和书店有售,欢迎购买,京东自营链接:http:/ ...
- strace命令用法详解
Linux利器 strace strace常用来跟踪进程执行时的系统调用和所接收的信号. 在Linux世界,进程不能直接访问硬件设备,当进程需要访问硬件设备(比如读取磁盘文件,接收网络数据等等)时,必 ...
- Android开发,在Activity启动时,默认隐藏软键盘。和遮挡Edittext时的处理
在Activity启动时,默认隐藏软键盘: 在AndroidManifest.xml中找到你得Activity ,为它添加属性: android:windowSoftInputMode="s ...
- linq操作符:限定操作符
限定操作符运算返回一个Boolean值,该值指示序列中是否有一些元素满足条件或者是否所有元素都满足条件. 一.All操作符 All方法用来确定是否序列中的所有元素都满足条件.看下面的例子: using ...
- PHP和MySQL实现消息队列
最近遇到一个批量发送短信的需求,短信接口是第三方提供的.刚开始想到,获取到手机号之后,循环调用接口发送不就可以了吗? 但很快发现问题:当短信数量很大时,不仅耗时,而且成功率很低. 于是想到,用PHP和 ...
- asp.net http请求图
从网上看到的一些资源结合理解画出请求 没有详细细分,大体步骤请求如下图
- 安卓程序代写 网上程序代写[原]BluetoothSocket详解
一. BluetoothSocket简介 1. 简介 客户端与服务端 : BluetoothSocket 和 BluetoothServerSocket 类似于Java中的套接字的 Socket 和 ...
- 【转】VMware Fusion Professional 10 序列号
http://bbs.feng.com/forum.php?mod=viewthread&tid=11456176
- QTcpSocket使用过程中的一些问题记录
目前,在将原来C的socket通讯改为使用Qt类库QTcpSocket通讯,在修改过程中遇到不少问题,在此将问题一并记录,以备后面使用. 采用的通讯方式:QTimer定时器.QThread多线程和QT ...