Questions tagged «expression-trees»

表达式树是树结构中代码的抽象表示,其中树的每个节点都代表编程构造(条件,赋值,方法调用等)。


21
从Lambda表达式中检索属性名称
通过lambda表达式传递时,是否有更好的方法来获取属性名称?这是我目前拥有的。 例如。 GetSortingInfo<User>(u => u.UserId); 仅当属性为字符串时,才将其强制转换为memberexpression。因为并非所有属性都是字符串,所以我不得不使用object,但是它将为这些返回unaryexpression。 public static RouteValueDictionary GetInfo<T>(this HtmlHelper html, Expression<Func<T, object>> action) where T : class { var expression = GetMemberInfo(action); string name = expression.Member.Name; return GetInfo(html, name); } private static MemberExpression GetMemberInfo(Expression method) { LambdaExpression lambda = method as LambdaExpression; if (lambda == null) throw new …

1
Roslyn SyntaxNodes是否可以重用?
我一直在研究Roslyn CTP,尽管它解决了与Expression Tree API类似的问题,但两者都是不可变的,但Roslyn却以完全不同的方式做到了: Expression节点没有对父节点的引用,而是使用进行了修改ExpressionVisitor,因此可以重复使用大部分部件。 SyntaxNode另一方面,罗斯林(Roslyn's )对其父节点进行了引用,因此所有节点实际上都成为了无法重用的块。类似的方法Update,ReplaceNode等等,提供了进行修改。 这在哪里结束?Document?Project?ISolution?API促进了树的逐步更改(而不是向上按钮),但是是否每个步骤都进行了完整复制? 他们为什么做出这样的选择?我缺少一些有趣的把戏吗?

5
该Expression.Constant()无法做的Expression.Quote()有什么作用?
注意:我知道前面的问题“ LINQ的Expression.Quote方法的目的是什么?”,但是如果您继续阅读,将会发现它没有回答我的问题。 我了解所陈述的目的Expression.Quote()是什么。但是,Expression.Constant()可以用于相同目的(除了Expression.Constant()已经用于所有目的之外)。因此,我根本不明白为什么Expression.Quote()需要这样做。 为了证明这一点,我写了一个简单的示例,该示例通常会用到Quote(请参见标有感叹号的行),但是我Constant改用了它,并且效果也很好: string[] array = { "one", "two", "three" }; // This example constructs an expression tree equivalent to the lambda: // str => str.AsQueryable().Any(ch => ch == 'e') Expression<Func<char, bool>> innerLambda = ch => ch == 'e'; var str = Expression.Parameter(typeof(string), "str"); var expr = Expression.Lambda<Func<string, bool>>( …

4
LINQ to Entities仅支持使用IEntity接口转换EDM基本类型或枚举类型
我有以下通用扩展方法: public static T GetById<T>(this IQueryable<T> collection, Guid id) where T : IEntity { Expression<Func<T, bool>> predicate = e => e.Id == id; T entity; // Allow reporting more descriptive error messages. try { entity = collection.SingleOrDefault(predicate); } catch (Exception ex) { throw new InvalidOperationException(string.Format( "There was an error retrieving …


4
编译的C#Lambda表达式性能
考虑对集合进行以下简单操作: static List<int> x = new List<int>() { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 }; var result = x.Where(i => i % 2 == 0).Where(i => i > 5); 现在让我们使用表达式。以下代码大致等效: static void UsingLambda() { Func<IEnumerable<int>, IEnumerable<int>> lambda = l => l.Where(i => i % 2 == …

8
如何在通用扩展方法中使用字符串列名称对IQueryable应用OrderBy?
public static IQueryable<TResult> ApplySortFilter<T, TResult>(this IQueryable<T> query, string columnName) where T : EntityObject { var param = Expression.Parameter(typeof(T), "o"); var body = Expression.PropertyOrField(param,columnName); var sortExpression = Expression.Lambda(body, param); return query.OrderBy(sortExpression); } 因为不是从sortExpression推断出OrderBy的类型,所以我需要在运行时指定如下类型: var sortExpression = Expression.Lambda<T, TSortColumn>(body, param); 要么 return query.OrderBy<T, TSortColumn>(sortExpression); 我认为这是不可能的,因为TSortColumn只能在运行时确定。 有没有解决的办法?

7
表达树的假人?[关闭]
已关闭。这个问题需要更加集中。它当前不接受答案。 想改善这个问题吗?更新问题,使其仅通过编辑此帖子来关注一个问题。 6年前关闭。 改善这个问题 在这种情况下,我是假人。 我试图在Google上阅读这些内容,但我不明白。有人可以简单说明一下它们是什么以及为什么有用吗? 编辑:我正在谈论.Net中的LINQ功能。

9
访问成员表达式的值
如果我有产品。 var p = new Product { Price = 30 }; 我有以下linq查询。 var q = repo.Products().Where(x=>x.Price == p.Price).ToList() 在一个IQueryable提供程序中,我得到了一个包含常量表达式的p.Price的MemberExpression,但是似乎无法从中获得值“ 30”。 更新 我已经尝试过了,但是似乎没有用。 var memberExpression = (MemberExpression)GetRootConstantExpression(m); var fi = (PropertyInfo)memberExpression.Member; var val = fi.GetValue(((ConstantExpression)memberExpression.Expression).Value, null); 干杯。

7
表达式树的实际使用
已关闭。这个问题需要更加集中。它当前不接受答案。 想改善这个问题吗?更新问题,使其仅通过编辑此帖子来关注一个问题。 5年前关闭。 改善这个问题 表达式树是一个不错的功能,但是它的实际用途是什么?它们可以用于某种形式的代码生成或元编程吗?

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.