Expression Tree

最近在看Linq的Expression Tree,主要是做Enterprise Library的例子的时候,在数据层搭建要用泛型来简化代码。

Expression Tree的例子比较多,可以参考老赵的“表达式树”配合“泛型参数字典”定义通用操作LINQ与DLR的Expression tree 系列。

我仿照通用操作写了个减法操作:

	public static class EnumerableExtensions
	{
		public static IEnumerable<T> Diminish<T>(this IEnumerable<T> source)
		{
			T diminish = default(T);
			bool first = true;

			foreach (var item in source)
			{
				if (first)
				{
					diminish = item;
					first = false;
				}
				else
				{
					diminish = SubtractOperation<T>.Substract(diminish, item);
				}
			}
			return diminish;
		}
	}

	public static class SubtractOperation<T>
	{
		static SubtractOperation()
		{
			var x = Expression.Parameter(typeof(T), "x");
			var y = Expression.Parameter(typeof(T), "y");
			var subtract = Expression.Subtract(x, y);
			var lambda = Expression.Lambda<Func<T, T, T>>(subtract, x, y);
			s_subtract = lambda.Compile();
		}

		private static Func<T, T, T> s_subtract;

		public static T Substract(T x, T y)
		{
			return s_subtract(x, y);
		}
	}

  

其它的也没什么好说的,三四年前的东东了。

posted @ 2012-08-03 10:36  Stopwatch  阅读(373)  评论(0)    收藏  举报