Деревья выражений - хорошая функция, но каковы ее практические применения? Могут ли они использоваться для генерации кода или метапрограммирования или для некоторых таких?
Практическое использование деревьев выражений
Ответ 1
Как отмечает Джон, я использую их для предоставления общих операторов с .NET 3.5. Я также использую их (снова в MiscUtil), чтобы обеспечить быстрый доступ к конструкторам, отличным от по умолчанию (вы не можете использовать Delegate.CreateDelegate
с конструкторами, но Expression
отлично работает).
Другие использования созданных вручную деревьев выражений:
Но действительно, выражение - очень универсальный способ написания любого динамического кода. Гораздо проще, чем Reflection.Emit
, а для моих денег проще понять, чем CodeDOM. А в .NET 4.0 у вас есть еще больше опций. Я показываю основы написания кода через Expression
в моем блоге.
Ответ 2
Марк Гравелл использовал их в эффекте MiscUtil для реализации общие операторы.Ответ 3
Я только что создал generic filter function
с помощью ExpressionTree
.. Я хочу 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
. Простой и фантастический.... я думаю...!!!!!!!!
Ответ 4
Я использую их для создания динамических запросов, будь то сортировка или фильтрация данных. В качестве примера:
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));
Ответ 5
Реализация LINQ-провайдеров в основном выполняется обработкой деревьев выражений. Я также использую их для удаления литеральных строк из моего кода:
Ответ 6
Я использовал дерево выражений для построения оценщика математического выражения: Построение оценщика выражений с деревьями выражений на С#
Ответ 7
Вы можете использовать их для создания своего собственного провайдера linq для веб-сайта, такого как Google или Flickr или Amazon, собственный веб-сайт или другой поставщик данных.
Ответ 8
Первоначально Jomo Fisher, Густаво Гуэрра опубликовала пересмотренную версию статический словарь строк.
Где через деревья выражений - динамическое выражение, которое обеспечивает действительно (читаемый: смешно) словарь.
Реализация создает динамическое дерево решений, которое выбирает значение корня в соответствии с длиной входной строки, затем первой буквой, затем второй буквой и т.д.
Это в конечном счете работает намного быстрее, чем эквивалентный словарь.