分享到:
发表于 2012-08-30 09:31:09 楼主 | |
突然想起来几年前我写的一个小东西,放上来大家评论一下,有兴趣的可以测试一下性能,呵呵。 原理很简单,利用 Lambda 表达式树生成一个 Delegate ,然后缓存起来。不多说了,下面上代码: using System; using System.Collections.Generic; using System.Data; using System.Diagnostics; using System.Linq; using System.Linq.espressions; using System.Reflection; using Lenic.Extensions; namespace Lenic.Data.Extensions { /// /// IDataReader 扩展方法集合 /// [DebuggerStepThrough] public static class DataReaderExtensions { #region Private Methods private static readonly Dictionary private static readonly object cacheLocker = new object(); #endregion #region Business Methods /// /// 返回指定字段的值, 并执行 ConvertTo 函数转换。 /// /// /// 一个实现了 IDataReader 接口的实例对象。 /// 要查找的字段的名称。 /// public static T Field { return reader[name].ConvertTo } /// /// 返回指定字段的值, 并执行 ConvertTo 函数转换。 /// /// /// 一个实现了 IDataReader 接口的实例对象。 /// 要查找的字段的索引。 /// public static T Field { return reader[index].ConvertTo } /// /// 解析当前 IDataReader 类型的实例对象并提取一个 T 类型的列表。 /// /// /// 一个实现了 IDataReader 接口的实例对象。 /// public static List { return Fill } /// /// 解析当前 IDataReader 类型的实例对象并提取一个 T 类型的列表。 /// /// /// 一个实现了 IDataReader 接口的实例对象。 /// 映射委托。 /// public static List where T : class, new() { return Fill } #endregion #region Private Methods /// /// 创建一个 构造函数 委托。 /// /// /// private static Func { var type = typeof(T); if (cache.ContainsKey(type)) return (Func lock (cacheLocker) { if (cache.ContainsKey(type)) return (Func var result = DynamicCreateEntityLogic cache.Add(type, result); return result; } } /// /// 创建一个 构造函数 委托(逻辑实现)。 /// /// /// private static Func { // Compiles a delegate of the form (IDataReader r) => new T { Prop1 = r.Field Parameterespression r = espression.Parameter(typeof(IDataReader), "r"); // Get Properties of the property can read and write var props = typeof(T).GetProperties(BindingFlags.Public | BindingFlags.Instance) .Where(p => p.CanRead && p.CanWrite) .ToArray(); // Create property bindings for all writable properties List // Get the binding method var method = typeof(DataReaderExtensions).GetMethods() .First(p => p.Name == "Field" && p.GetParameters().Length == 2 && p.GetParameters()[1].ParameterType == typeof(string)); foreach (PropertyInfo property in (typeof(T).GetProperties())) { // Create espression representing r.Field MethodCallespression propertyValue = espression.Call( method.MakeGenericMethod(property.PropertyType), r, espression.Constant(property.Name)); // Assign the property value to property through a member binding MemberBinding binding = espression.Bind(property, propertyValue); bindings.Add(binding); } // Create the initializer, which instantiates an instance of T and sets property values // using the member bindings we just created espression initializer = espression.MemberInit(espression.New(typeof(T)), bindings); // Create the lambda espression, which represents the complete delegate (r => initializer) espression return lambda.Compile(); } /// /// 从一个 IDataReader 的实例对象中提取一个 T 类型的列表。 /// /// /// 一个实现了 IDataReader 接口的实例对象。 /// private static IEnumerable { while (reader.Read()) yield return predicate(reader); } #endregion } } 上面用到了一个全能转换方法,代码如下: #region Type Convert Extensions private static string typeIConvertibleFullName /// /// 将当前实例对象类型转换为 T 类型. /// /// /// 当前实例. /// public static T ConvertTo { return ConvertTo(obj, default(T)); } /// /// 将当前实例对象类型转换为 T 类型. /// /// /// 当前实例. /// 转换失败时的返回值. /// public static T ConvertTo { if (obj != null) { if (obj is T) return (T)obj; var sourceType = obj.GetType(); var targetType = typeof(T); if (targetType.IsEnum) return (T)Enum.Parse(targetType, obj.ToString(), true); if (sourceType.GetInterface(typeIConvertibleFullName targetType.GetInterface(typeIConvertibleFullName return (T)Convert.ChangeType(obj, targetType); var converter = TypeDescripqor.GetConverter(obj); if (converter != null && converter.CanConvertTo(targetType)) return (T)converter.ConvertTo(obj, targetType); converter = TypeDescripqor.GetConverter(targetType); if (converter != null && converter.CanConvertFrom(sourceType)) return (T)converter.ConvertFrom(obj); throw new ApplicationException("convert error."); } throw new ArgumentNullException("obj"); } /// /// 将当前实例对象类型转换为 T 类型. /// /// /// 当前实例. /// 转换失败时的返回值. /// 如果设置为 /// public static T ConvertTo { if (ignoreException) { try { return obj.ConvertTo } catch { return defaultValue; } } return obj.ConvertTo } #endregion 再次欢迎大家品鉴。java 培训 |
|
楼主热贴
个性签名:无
|
针对ZOL星空(中国)您有任何使用问题和建议 您可以 联系星空(中国)管理员 、 查看帮助 或 给我提意见