Cây biểu đạt là một tính năng tốt đẹp, nhưng sử dụng thực tế của nó là gì? Chúng có thể được sử dụng cho một số loại tạo mã hoặc lập trình meta hay một số kiểu như vậy?Sử dụng thực tế cây biểu thức
Trả lời
Bạn có thể sử dụng chúng để xây dựng nhà cung cấp LINQ của riêng bạn cho một trang web như Google hoặc Flickr hoặc Amazon, trang web của riêng bạn hoặc một nhà cung cấp dữ liệu khác.
Marc Gravell đã sử dụng chúng để có hiệu quả tuyệt vời trong MiscUtil để triển khai generic operators.
Darn, đánh bại tôi với nó ;-p –
Việc triển khai các nhà cung cấp LINQ chủ yếu được thực hiện bằng cách xử lý các cây biểu thức. Tôi cũng đang sử dụng chúng để loại bỏ các chuỗi chữ từ mã của tôi:
Như Jon lưu ý, tôi sử dụng chúng để cung cấp generic operators với .NET 3.5. Tôi cũng sử dụng chúng (một lần nữa trong MiscUtil) để cung cấp truy cập nhanh đến các nhà xây dựng không mặc định (bạn không thể sử dụng Delegate.CreateDelegate
với các nhà xây dựng, nhưng Expression
hoạt động tốt).
Các ứng dụng khác của cây biểu hiện bằng tay tạo:
Nhưng thực sự, Expression là một cách rất linh hoạt của viết bất kỳ mã năng động. Đơn giản hơn nhiều so với Reflection.Emit
và với số tiền của tôi, đơn giản để hiểu hơn CodeDOM. Và trong .NET 4.0, bạn có sẵn even more options. Tôi hiển thị các nguyên tắc cơ bản của mã viết qua Expression
on my blog.
Cảm ơn. blog không hiển thị !!! – pixparker
@pixparker Tôi vừa thử nghiệm nó: làm việc tốt –
Tôi sử dụng chúng để tạo truy vấn động, cho dù đó là để sắp xếp hoặc lọc dữ liệu. Như một ví dụ:
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));
Nguyên bởi Jomo Fisher, Gustavo Guerra công bố một phiên bản sửa đổi của các static string dictionary.
Trong đó thông qua cây biểu thức, một biểu thức động cung cấp từ điển thực sự (đọc: ridiculously).
Việc triển khai tạo ra cây quyết định động chọn giá trị corrent theo độ dài của chuỗi đầu vào, sau đó là chữ cái đầu tiên, sau đó là chữ cái thứ hai, v.v.
Điều này cuối cùng chạy nhanh hơn nhiều so với Từ điển tương đương.
tôi đã sử dụng cây biểu thức để xây dựng một đánh giá biểu thức toán học: Building Expression Evaluator with Expression Trees in C#
tôi vừa tạo ra một generic filter function
sử dụng ExpressionTree
.. Tôi muốn share
với các bạn ...
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();
}
....... Tôi biết nó cũng có thể được thực hiện bằng Reflection
... nhưng điều này rất nhanh hoặc tôi có thể nói tương đương với Lambda
sau lần biên dịch đầu tiên ... Lần lặp đầu tiên chỉ chậm trung bình 10 phần nghìn giây ... Vì vậy, đây là phép thuật Expression Tree
. Đơn giản và tuyệt vời .... Tôi nghĩ ... !!!!!!!!
Tốt đẹp! Cảm ơn các ví dụ. –
- 1. Cây biểu thức Java
- 2. Cây biểu thức cho phương thức String.IndexOf
- 3. Kết hợp các biểu thức trong cây biểu thức
- 4. Chữ ký thực tế sử dụng Reflection
- 5. Cây đánh giá biểu thức trong Haskell
- 6. Cây biểu thức trong .NET - Thư viện?
- 7. Sử dụng thực tế từ khóa `stackalloc`
- 8. Lambda để chuyển đổi cây biểu thức
- 9. Tạo cây biểu thức trong R
- 10. Trích xuất tên phương thức từ cây biểu thức?
- 11. Sử dụng thực tế của System.WeakReference
- 12. jQuery .each() - Sử dụng thực tế?
- 13. Thực tế Sử dụng Traversal Cấp bậc
- 14. Giới hạn chiều sâu cây biểu thức
- 15. Xây dựng cây biểu thức nhị phân
- 16. Trích dẫn mã và cây biểu thức
- 17. Chuyển đổi biểu thức lambda vào một cây biểu
- 18. Cách sử dụng Mẫu biểu thức
- 19. sử dụng biểu thức rdlc?
- 20. cách tạo bảng tổng hợp với cột động bằng cách sử dụng biểu thức cây linq
- 21. Xây dựng truy vấn LINQ GroupBy bằng cách sử dụng các cây biểu thức
- 22. Việc sử dụng các trường ẩn có thực tế không?
- 23. Ví dụ về truyền tải cây trước/sau đặt hàng thực tế
- 24. Hình thức động Django - dân số trên thực tế?
- 25. Cây biểu thức là gì, bạn sử dụng chúng như thế nào và tại sao bạn sử dụng chúng?
- 26. Làm cách nào để biên dịch Biểu thức xuống kết quả thực tế?
- 27. Xác định sự kiện qua cây biểu thức LINQ
- 28. Sử dụng phương thức Express JS .all(): phát hiện ra ĐỘNG TỪ nào đã được sử dụng thực tế
- 29. Xây dựng 'phẳng' thay vì 'cây' biểu thức LINQ
- 30. Khi không sử dụng biểu thức lambda
bản sao có thể có của [Một số trường hợp trong đó cây biểu thức hữu ích?] (Http://stackoverflow.com/questions/27726/what-are-some-instances-in-which-expression-trees-are- hữu ích) – nawfal