【续】使用泛型编写通用的C#预处理类型转换方法(使用委托提高性能)

优化后的代码:

public static class Converter
    {
        /// <summary>
        /// 转换为其他继承IConvertible的类型
        /// </summary>
        /// <typeparam name="T">转换的类型</typeparam>
        /// <param name="value">要转换的值</param>
        /// <param name="success">是否成功</param>
        /// <returns></returns>
        public static T To<T>(this IConvertible value, out bool success) where T : IConvertible
        {
            if (value == null)
            {
                success = true;

                return default(T);
            }

            Type tResult = typeof(T);

            if (tResult == typeof(string))
            {
                success = true;

                return (T)(object)value.ToString();
            }

            TryParseDelegate<T> tryParseDelegate;

            if (_TryParse.ContainsKey(tResult.FullName))
            {
                tryParseDelegate = (TryParseDelegate<T>)_TryParse[tResult.FullName];
            }
            else
            {
                MethodInfo mTryParse = tResult.GetMethod("TryParse", BindingFlags.Public | BindingFlags.Static, Type.DefaultBinder, new Type[] { typeof(string), tResult.MakeByRefType() }, new ParameterModifier[] { new ParameterModifier(2) });

                tryParseDelegate = (TryParseDelegate<T>)Delegate.CreateDelegate(typeof(TryParseDelegate<T>), mTryParse);

                _TryParse.Add(tResult.FullName, tryParseDelegate);
            }

            T result;

            success = tryParseDelegate(value.ToString(), out result);

            return result;
        }

        /// <summary>
        /// 转换为其他继承IConvertible的类型
        /// </summary>
        /// <typeparam name="T">转换的类型</typeparam>
        /// <param name="value">要转换的值</param>
        /// <returns></returns>
        public static T To<T>(this IConvertible value) where T : IConvertible
        {
            bool success;
            return To<T>(value, out success);
        }

        private delegate bool TryParseDelegate<T>(string s, out T tResult) where T:IConvertible;

        private static Dictionary<string, object> _TryParse = new Dictionary<string, object>();
    }

}

运行效率测试

测试代码请转到上一篇

第一次:3519

第二次:3570

第三次:3783

对比完全没优化过的时候大概提高了6倍,把MethodInfo对象保存起来保存起来的优化大概提高了4倍

【续】使用泛型编写通用的C#预处理类型转换方法(使用委托提高性能)

时间: 2024-11-05 22:38:42

【续】使用泛型编写通用的C#预处理类型转换方法(使用委托提高性能)的相关文章

使用泛型编写通用的C#预处理类型转换方法

废话 从.net3.5发布后,就很多前辈利用泛型创造出了很多很有趣的代码,通用的转换方法也被写的烂了,小弟不才,今天又来写一遍,只是为了做个人知识的管理和追赶大牛的步伐,请各位路过的大大多多批评指正. 思路 1.基本类型都实现了IConvertible这个接口 2.基本类型都实现了TryParse方法 实现 public static class Converter { /// <summary> /// 转换为其他继承IConvertible的类型 /// </summary>

Hibernate结合JPA编写通用泛型多条件查询

项目中使用Hibernate和JPA对数据库对象进行实例化,但是生成的方法不支持多条件查询.而如果针对每一个数据库对象进行多条件查询编码,则会变得很麻烦,而且一旦以后发生表结构发生变化,这些方法可能还需要进行重新编码.所以考虑编写一个方法可以对数据库对象进行多条件查询,并返回泛型对象,这样就可以方便使用.具体实现思路如下: 第一步:编写数据库查询参数对象,此部分包含两个,一个是查询实体名称(QueryCondition.java),一个是数据库查询条件对象(QueryParameter.java

Java -- JDBC_利用反射及 JDBC 元数据编写通用的查询方法

先利用 SQL 进行查询,得到结果集: 利用反射创建实体类的对象:创建对象: 获取结果集的列的别名: 再获取结果集的每一列的值, 结合 3 得到一个 Map,键:列的别名,值:列的值: 再利用反射为 2 的对应的属性赋值:属性即为 Map 的键,值即为 Map 的值. 使用 JDBC 驱动程序处理元数据 Java 通过JDBC获得连接以后,得到一个Connection 对象,可以从这个对象获得有关数据库管理系统的各种信息,包括数据库中的各个表,表中的各个列,数据类型,触发器,存储过程等各方面的信

JDBC:编写通用的 JDBCUtils工具类

基本上已经可以应付常用方法 1.为JDBCUtils 添加事务处理方法 2.处理多线程并发访问问题 package cn.cil.Utls; import java.sql.Connection; import java.sql.ResultSet; import java.sql.SQLException; import javax.sql.DataSource; import com.mchange.v2.c3p0.ComboPooledDataSource; /** * 编写通用的 JDB

JDBC学习笔记——利用反射及JDBC元数据编写通用的查询方法

我们的查询操作,对于不同的数据表examstudent和customers,会有不同的代码编写过程,利用反射和JDBC元数据可以编写通用的方法进行对不同数据表的查询. 在此之前我们是这样做的: 查询customers表中的字段以及字段值: 1 public Customer getCustomer(String sql, Object... args) { 2 Customer customer = null; 3 Connection connection = null; 4 Prepared

【转】JDBC学习笔记(5)——利用反射及JDBC元数据编写通用的查询方法

转自:http://www.cnblogs.com/ysw-go/ JDBC元数据 1)DatabaseMetaData /** * 了解即可:DatabaseMetaData是描述数据库的元数据对象 * 可以由Connection得到 */ 具体的应用代码: 1 @Test 2 public void testDatabaseMetaData(){ 3 Connection connection=null; 4 ResultSet resultSet=null; 5 try { 6 conne

缓冲区溢出分析第05课:编写通用的ShellCode

前言 我们这次的实验所要研究的是如何编写通用的ShellCode.可能大家会有疑惑,我们上次所编写的ShellCode已经能够很好地完成任务,哪里不通用了呢?其实这就是因为我们上次所编写的ShellCode,是采用"硬编址"的方式来调用相应API函数的.也就是说,我们需要首先获取所要使用函数的地址,然后将该地址写入ShellCode,从而实现调用.这种方式对于所有的函数,通用性都是相当地差,试想,如果系统的版本变了,那么很多函数的地址往往都会发生变化,那么调用肯定就会失败了.所以本次的

利用EF和C#泛型实现通用分页查询

利用EF和C#泛型实现通用分页查询 Entity Framework 是微软以 ADO.NET 为基础所发展出来的对象关系对应 (ORM) 解决方案,是微软的ORM框架.此框架将数据库中的表信息通过xml与实体类对象相关联,使得开发人员只需要关心实体对象,而不需要手动操作数据库,对实体对象的修改会映射到数据库中,这样大大提高了开发效率.以下代码使用了EF.泛型.泛型委托.lambda.匿名类.dynamic动态类型等知识完成了EF的crud,并且提供了一个高效的通用分页查询方法,采用了延时加载,

JDBC课程5--利用反射及JDBC元数据(ResultSetMetaData)编写通用的查询方法

/**-利用反射及JDBC元数据编写通用的查询方法 * 1.先利用SQl语句进行查询,得到结果集--> * 2.查找到结果集的别名:id--> * 3.利用反射创建实体类的对象,创建author对象--> * 4.获取结果集的列的别名: id,nation,name * 5.再获得结果集的每一列的值, * 结合2得到一个map键值对: 键: 列的别名,值: 列的值: {id=1,nation=中国,name=莫言} * 6.再利用反射为2的对应的属性赋值,属性为Map 的键,值为Map