12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667 |
- /* 作者: 季健国
- * 创建时间: 2012/7/19 11:19:35
- *
- */
- using System;
- using System.Collections.Generic;
- using System.Linq;
- using System.Text;
- using System.Reflection;
- using System.Linq.Expressions;
- namespace Ant.Service.Common
- {
-
- /// <summary>
- /// LINQ比较器
- /// </summary>
- /// <typeparam name="T"></typeparam>
- public class FastPropertyComparer<T> : IEqualityComparer<T>
- {
- private Func<T, Object> getPropertyValueFunc = null;
- /// <summary>
- /// 通过propertyName 获取PropertyInfo对象
- /// </summary>
- /// <param name="propertyName"></param>
- public FastPropertyComparer(string propertyName)
- {
- PropertyInfo _PropertyInfo = typeof(T).GetProperty(propertyName,
- BindingFlags.GetProperty | BindingFlags.Instance | BindingFlags.Public);
- if (_PropertyInfo == null)
- {
- throw new ArgumentException(string.Format("{0} is not a property of type {1}.",
- propertyName, typeof(T)));
- }
- ParameterExpression expPara = Expression.Parameter(typeof(T), "obj");
- MemberExpression me = Expression.Property(expPara, _PropertyInfo);
- getPropertyValueFunc = Expression.Lambda<Func<T, object>>(me, expPara).Compile();
- }
- #region IEqualityComparer<T> Members
- public bool Equals(T x, T y)
- {
- object xValue = getPropertyValueFunc(x);
- object yValue = getPropertyValueFunc(y);
- if (xValue == null)
- return yValue == null;
- return xValue.Equals(yValue);
- }
- public int GetHashCode(T obj)
- {
- object propertyValue = getPropertyValueFunc(obj);
- if (propertyValue == null)
- return 0;
- else
- return propertyValue.GetHashCode();
- }
- #endregion
- }
- }
|