标签: expression-trees

C#中的错误:"表达式树可能不包含基本访问" - 为什么不呢?

我正在调用一种接受的方法Expression<Func<bool>>.

作为我传递的表达的一部分:

this.Bottom == base.lineView.Top
Run Code Online (Sandbox Code Playgroud)

编译器给了我一个错误

表达式树可能不包含基本访问权限

所以我只是把它改成了

this.Bottom == this.lineView.Top
Run Code Online (Sandbox Code Playgroud)

因为该成员无论如何都受到保护,现在它起作用了.

但这个错误真的让我:为什么这会base是一个问题呢?特别是如果使用this而不是工作但在语法上是相同的结果(相同的变量被访问)?

.net c# expression-trees

44
推荐指数
2
解决办法
2140
查看次数

Expression.Lambda和运行时的查询生成,最简单的"Where"示例

我试图在运行时生成一个简单的Lambda Expression而没有运气......这样的事情:

var result = queryableData.Where(item => item.Name == "Soap")
Run Code Online (Sandbox Code Playgroud)

这是我的示例类和fixture可查询:

public class Item
{
    public int Id { get; set; }
    public string Name { get; set; }
}

IQueryable<Item> queryableData = ...;
Run Code Online (Sandbox Code Playgroud)

然后我在运行时生成一个lambda表达式,正确的代码如下:

//"item" in "item =>..."
var item = Expression
    .Parameter(typeof(Item), "item");

//property of my item, this is "item.Name"
var prop = Expression
    .Property(item, "Name");

//then "Soap" in '... => item.Name=="Soap"'
var value = Expression.Constant("Soap");

//equality expression "==" in my primer
var equals = Expression.Equal(prop, …
Run Code Online (Sandbox Code Playgroud)

.net c# lambda dynamic-language-runtime expression-trees

43
推荐指数
1
解决办法
2万
查看次数

PropertyExpression丢失了

我尝试使用表达式编写一个简单的示例,但有一个奇怪的错误:我无法PropertyExpression在编译时使用.当我写它时,我得到一个错误,它不编译 在此输入图像描述 但是在断点运行时我可以写

var runtimeBody = (System.Linq.Expressions.PropertyExpression)body2;
Run Code Online (Sandbox Code Playgroud)

它工作,并按预期演员.选择框架4.5.1作为目标.

.net c# lambda expression expression-trees

41
推荐指数
1
解决办法
6504
查看次数

如何在C#表达式树中设置字段值?

鉴于:

FieldInfo field = <some valid string field on type T>;
ParameterExpression targetExp = Expression.Parameter(typeof(T), "target");
ParameterExpression valueExp = Expression.Parameter(typeof(string), "value");
Run Code Online (Sandbox Code Playgroud)

如何编译lambda表达式以将"target"参数上的字段设置为"value"?

c# lambda expression-trees

40
推荐指数
3
解决办法
2万
查看次数

如何从Expression <Func <MyClass,string >>动态创建Expression <Func <MyClass,bool >>谓词?

我试图追加谓词和我的目标是创建相同的表达式:

Services.Where(s => s.Name == "Modules" && s.Namespace == "Namespace");
Run Code Online (Sandbox Code Playgroud)

我有以下代码:

Expression<Func<Service,string>> sel1 = s => s.Name;
Expression<Func<Service,string>> sel2 = s => s.Namespace;

var val1 = Expression.Constant("Modules");
var val2 = Expression.Constant("Namespace");

Expression e1 = Expression.Equal(sel1.Body, val1);
Expression e2 = Expression.Equal(sel2.Body, val2);
var andExp = Expression.AndAlso(e1, e2);

ParameterExpression argParam = Expression.Parameter(typeof(string), "s");
var lambda = Expression.Lambda<Func<string, bool>>(andExp, argParam);
Run Code Online (Sandbox Code Playgroud)

这将创建以下输出:

s => ((s.Name == "Modules") AndAlso (s.Namespace == "Namespace"))
Run Code Online (Sandbox Code Playgroud)

但是,这是错误的,因为NameNamespace的参数不相同.如果我将其中一个表达式选择器更改为:

Expression<Func<Service,string>> sel2 = srv => srv.Namespace;
Run Code Online (Sandbox Code Playgroud)

输出将是:

s …
Run Code Online (Sandbox Code Playgroud)

c# linq expression-trees linq-expressions

40
推荐指数
2
解决办法
5万
查看次数

为什么表达式树不能包含命名参数规范?

使用AutoMapper,我找到了一个命名参数非常适合的地方:

.ForMember(s => s.MyProperty, opt => opt.MapFrom(s => BuildMyProperty(s, isAdvanced: false)))
Run Code Online (Sandbox Code Playgroud)

但编译器对我大吼:

表达式树可能不包含命名参数规范

所以我不得不回复:

.ForMember(s => s.MyProperty, opt => opt.MapFrom(s => BuildMyProperty(s, false)))
Run Code Online (Sandbox Code Playgroud)

有谁知道为什么编译器在这种情况下不允许使用命名参数?

c# expression-trees c#-4.0

40
推荐指数
1
解决办法
3515
查看次数

Lambda到Expression树的转换

我会保持简单,

如何从lambda中获取表达式树?

或者从查询表达式?

c# lambda expression-trees

39
推荐指数
3
解决办法
2万
查看次数

从MemberExpression中获取对象?

所以,假设我在C#中有以下表达式:

Expression<Func<string>> expr = () => foo.Bar;
Run Code Online (Sandbox Code Playgroud)

如何提取对foo的引用?

c# lambda expression-trees

38
推荐指数
2
解决办法
7542
查看次数

如何创建一个调用IEnumerable <TSource> .Any(...)的表达式树?

我正在尝试创建一个表示以下内容的表达式树:

myObject.childObjectCollection.Any(i => i.Name == "name");
Run Code Online (Sandbox Code Playgroud)

为清楚起见,我有以下内容:

//'myObject.childObjectCollection' is represented here by 'propertyExp'
//'i => i.Name == "name"' is represented here by 'predicateExp'
//but I am struggling with the Any() method reference - if I make the parent method
//non-generic Expression.Call() fails but, as per below, if i use <T> the 
//MethodInfo object is always null - I can't get a reference to it

private static MethodCallExpression GetAnyExpression<T>(MemberExpression propertyExp, Expression predicateExp)
{
    MethodInfo method = typeof(Enumerable).GetMethod("Any", new[]{ typeof(Func<IEnumerable<T>, Boolean>)});
    return …
Run Code Online (Sandbox Code Playgroud)

.net c# linq expression-trees

37
推荐指数
2
解决办法
1万
查看次数

从string构造用于嵌套属性的LambdaExpression

我试图从属性的名称在运行时为嵌套属性创建一个lambda表达式.基本上我正在尝试创建由以下指定的lambda表达式:

var expression = CreateExpression<Foo, object>(foo => foo.myBar.name);

private static Expression CreateExpression<TEntity, TReturn>(Expression<Func<TEntity, TReturn>> expression)
{
    return (expression as Expression);
}
Run Code Online (Sandbox Code Playgroud)

随着课程:

class Foo
{
    public Bar myBar { get; set; }
}
class Bar
{
    public string name { get; set; }
}
Run Code Online (Sandbox Code Playgroud)

但是我得到的只是Foo字符串的类型"myBar.name"

如果它是一个普通的属性,例如只需要该值,"myBar"那么我可以使用以下内容:

private static LambdaExpression GetPropertyAccessLambda(Type type, string propertyName)
{
    ParameterExpression odataItParameter = Expression.Parameter(type, "$it");
    MemberExpression propertyAccess = Expression.Property(odataItParameter, propertyName);
    return Expression.Lambda(propertyAccess, odataItParameter);
}
Run Code Online (Sandbox Code Playgroud)

但是,此代码不适用于嵌套属性,我不知道如何创建LambdaExpression来完成工作foo.myBar.name.

我认为这将是这样的:

GetExpression(Expression.Call(GetExpression(Foo, "myBar"), "name")) …
Run Code Online (Sandbox Code Playgroud)

.net c# linq lambda expression-trees

35
推荐指数
1
解决办法
1万
查看次数