码迷,mamicode.com
首页 > 其他好文 > 详细

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

时间:2014-07-21 14:24:50      阅读:255      评论:0      收藏:0      [点我收藏+]

标签:style   blog   http   color   使用   os   

优化后的代码:

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#预处理类型转换方法(使用委托提高性能),布布扣,bubuko.com

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

标签:style   blog   http   color   使用   os   

原文地址:http://www.cnblogs.com/sheepswallow/p/3858157.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!