表达树是一个很好的功能,但它的实际用途是什么?他们可以用于某种代码生成或元编程或某些类似的?表达树的实际用法
表达树的实际用法
回答
您可以使用它们为Google或Flickr或Amazon等网站,您自己的网站或其他数据提供商构建自己的linq提供程序。
LINQ提供程序的实现主要通过处理表达式树来完成。我还使用他们从我的代码删除文字字符串:
由于乔恩指出,我用它们来提供generic operators使用.NET 3.5。我也使用它们(再次在MiscUtil中)提供对非默认构造函数的快速访问(不能使用Delegate.CreateDelegate
和构造函数,但Expression
工作正常)。
的手动创建的表达式树的其他用途:
不过说真的,表情写任何的动态代码非常灵活的方式。比Reflection.Emit
简单得多,而且我的钱比CodeDOM更容易理解。而在.NET 4.0中,您有even more options可用。我通过Expression
on my blog显示编写代码的基本原理。
谢谢。该博客没有显示出来! – pixparker 2016-01-02 16:08:15
@pixparker我刚测试过它:正常工作 – 2016-01-02 23:44:11
我使用它们来创建动态查询,无论是用于排序还是过滤数据。举个例子:
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));
最初由Jomo Fisher,Gustavo Guerra公布的 的static string dictionary的修订版。
其中通过表达式树,一个动态表达式,提供一个真正的(读:可笑)字典。
该实现创建一个动态决策树,根据输入字符串的长度选择corrent值,然后按第一个字母,然后第二个字母等等。
这最终运行得比等效词典快得多。
我用表达式树建立一个数学表达式求值:Building Expression Evaluator with Expression Trees in C#
我只是用ExpressionTree
创建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
做......但是这一个是巨大的快或我可以说相当于第一次编译后的...第一次迭代只是平均10毫秒慢...所以这是Expression Tree
的魔法。简单而美妙....我想...... !!!!!!!!
- 1. 相关实体的Lambda表达式树
- 2. 在Linq的表达式树到实体
- 3. 表达式树的后缀表示法
- 4. 使用表达式树的另一种表达树
- 5. Dispatcher.DisableProcessing的实际用法?
- 6. Powershell:$ ^和$$的实际用法?
- 7. MethodRental Class的实际用法?
- 8. 在表达式树中调用实例方法的最佳方法?
- 9. 表达式树多个实体
- 10. 合并实体框架表达式树
- 11. 表达式树实现问题
- 12. 表达式树
- 13. C++分流码算法和表达树实现
- 14. 使用表达式树
- 15. .Single(),.SingleOrDefault()方法的实际用法
- 16. 评估算术语法树表达式
- 17. Java表达式树
- 18. lambda表达式树
- 19. 转换的NSString,数据类型的表达,以实际的NSData
- 20. 表达式树的MongoDB LINQ
- 21. 表达式树NHibernate的
- 22. 表达式树邻.value的
- 23. 间谍方法调用实际方法
- 24. 表格的实际高度
- 25. fnGetData()表的实际内容
- 26. 查找Java程序的实际运行时调用树
- 27. 实际表比。格表
- 28. Javascript关闭的实际用法/示例
- 29. Mocked方法,但它调用实际的
- 30. 什么是克隆的实际用法
可能的重复[什么是表达式树有用的某些实例?](http://stackoverflow.com/questions/27726/what-are-some-instances-in-which-expression-trees-are-有用) – nawfal 2013-10-12 14:49:35