expression树的实际使用

expression式树是一个很好的function,但它的实际用途是什么? 他们可以用于某种代码生成或元编程或一些这样的?

正如Jon所说,我使用它们来为.NET 3.5提供generics操作符 。 我也使用它们(再次在MiscUtil)提供快速访问非默认的构造函数(你不能使用Delegate.CreateDelegate与构造函数,但Expression工作正常)。

手动创build的expression式树的其他用法:

  • 对象克隆
  • dynamic的LINQsorting
  • 作为编译器

但是,Expression是一种非常灵活的编写任何dynamic代码的方式。 比Reflection.Emit简单得多,而且我的钱比CodeDOM简单易懂。 而在.NET 4.0中,你有更多的选项可用。 我展示了通过Expression 在我的博客上编写代码的基础。

Marc Gravell在MiscUtil中使用它们来实现generics操作符 。

我使用它们来创builddynamic查询,无论是对数据进行sorting还是过滤。 举个例子:

 IQueryable<Data.Task> query = ctx.DataContext.Tasks; if (criteria.ProjectId != Guid.Empty) query = query.Where(row => row.ProjectId == criteria.ProjectId); if (criteria.Status != TaskStatus.NotSet) query = query.Where(row => row.Status == (int)criteria.Status); if (criteria.DueDate.DateFrom != DateTime.MinValue) query = query.Where(row => row.DueDate >= criteria.DueDate.DateFrom); if (criteria.DueDate.DateTo != DateTime.MaxValue) query = query.Where(row => row.DueDate <= criteria.DueDate.DateTo); if (criteria.OpenDate.DateFrom != DateTime.MinValue) query = query.Where(row => row.OpenDate >= criteria.OpenDate.DateFrom); var data = query.Select(row => TaskInfo.FetchTaskInfo(row)); 

我使用ExpressionTree创build了一个generic filter function ..我想和大家share一下…

Start

 var allFiltered= Filter(AllCustomer, "Name", "Moumit"); public static List<T> Filter<T>(this List<T> Filterable, string PropertyName, object ParameterValue) { ConstantExpression c = Expression.Constant(ParameterValue); ParameterExpression p = Expression.Parameter(typeof(T), "xx"); MemberExpression m = Expression.PropertyOrField(p, PropertyName); var Lambda = Expression.Lambda<Func<T, Boolean>>(Expression.Equal(c, m), new[] { p }); Func<T, Boolean> func = Lambda.Compile(); return Filterable.Where(func).ToList(); } 

One More

 string singlePropertyName=GetPropertyName((Property.Customer p) => p.Name); public static string GetPropertyName<T, U>(Expression<Func<T, U>> expression) { MemberExpression body = expression.Body as MemberExpression; // if expression is not a member expression if (body == null) { UnaryExpression ubody = (UnaryExpression)expression.Body; body = ubody.Operand as MemberExpression; } return string.Join(".", body.ToString().Split('.').Skip(1)); } 

Make it more expandable

 string multiCommaSeparatedPropertyNames=GetMultiplePropertyName<Property.Customer>(c => c.CustomerId, c => c.AuthorizationStatus) public static string GetMultiplePropertyName<T>(params Expression<Func<T, object>>[] expressions) { string[] propertyNames = new string[expressions.Count()]; for (int i = 0; i < propertyNames.Length; i++) { propertyNames[i] = GetPropertyName(expressions[i]); } return propertyNames.Join(); } 

…….我知道这也可以使用Reflection来完成…但是这个是非常快的,或者我可以说在第一次编译后相当于Lambda …第一次迭代只是平均10毫秒慢。所以这就是Expression Tree魔法。 简单而美妙….我想… !!!!!!!!

LINQ提供者的实现主要通过处理expression式树来完成。 我也使用它们从我的代码中删除文字string:

  • 单轨
  • NHibernate的

我使用expression式树build立一个mathexpression式求值器: 在C#中使用expression式树构buildexpression式求值器

您可以使用它们为Google或Flickr或Amazon等网站,您自己的网站或其他数据提供商构build自己的linq提供程序。

Gustavo Guerra最初由Jomo Fisher发布了静态string字典的修订版本。

凡通过expression式树,一个dynamicexpression式,提供了一个真正(读:可笑)字典。

该实现创build一个dynamic决策树,根据inputstring的长度,然后按第一个字母,然后第二个字母等等来selectcorrent值。

这最终比同等字典运行得更快。