【发布时间】:2021-09-29 23:40:38
【问题描述】:
这有点难以解释,所以我从一个例子开始。
class Program
{
static void Main(string[] args)
{
var lst = new List<Test>();
var value = "John";
var exp1 = lst.AsQueryable().Where(l => l.Name == "John").Expression as MethodCallExpression;
var exp2 = lst.AsQueryable().Where(l => l.Name == value).Expression as MethodCallExpression;
Console.WriteLine(exp1.Arguments.Last().ToString()); // l => (l.name == "John")
Console.WriteLine(exp2.Arguments.Last().ToString()); // l => (l.name == value(test1.Program+<>c__DisplayClass0_0).value)
}
}
class Test
{
public string Name { get; set; }
}
名称值 (John) 在 exp1 示例中是 ConstantExpression,我们可以使用 Expression.Constant() 函数创建它,但我需要以某种方式创建第二个表达式 (exp2),该值不仅仅是一个常量并且有一个局部变量的引用。 值是FieldExpression 在exp2 示例中。
主要目标是使用 Roslyn API 和表达式创建 exp2,我不知道应该如何准确地传递值来实现。
要创建exp1,我们可以这样做:
var parameter = Expression.Parameter(typeof(Test), "l");
var member = Expression.PropertyOrField( parameter , "Name");
var valueExp = Expression.Constant(value);
var exp1 = Expression.Equal(member, valueExp);
如何创建exp2 !?
【问题讨论】:
-
你的用例是什么?你想用它做什么?
-
@Timo:检查一下:github.com/alirezanet/Gridify/issues/24 EntityFramework SQL 提供程序在我们使用
ConstantExpression(最后两个 cmets)时有不同的行为
标签: c# lambda expression roslyn