C# 使用System.Linq.Expressions API重写Lambda表达式

C# 使用System.Linq.Expressions API重写Lambda表达式,c#,linq,expression,C#,Linq,Expression,我被困在这个问题上好几个小时了。我只想通过使用重写以下表达式来构建表达式树: 如果T是一个基元类型或枚举,则此方法可以正常工作。但是我得到了一个例外,如果T是一个引用类型,一个类等等 异常消息: 无法创建类型为“TypeName”的常量值。只有原始的 在此上下文中支持类型或枚举类型 提前谢谢 在本例中,只要值不为null,就不需要显式指定类型(我假设它不是null,因为您正在对其调用GetType()) 这应该可以做到 var param = Expression.Parameter(typeo

我被困在这个问题上好几个小时了。我只想通过使用重写以下表达式来构建表达式树:

如果
T
是一个基元类型或枚举,则此方法可以正常工作。但是我得到了一个例外,如果T是一个引用类型,一个
等等

异常消息:

无法创建类型为“
TypeName
”的常量值。只有原始的 在此上下文中支持类型或枚举类型


提前谢谢

在本例中,只要值不为null,就不需要显式指定类型(我假设它不是null,因为您正在对其调用
GetType()

这应该可以做到

var param = Expression.Parameter(typeof(T), "x");
var property = Expression.Property(param, "SomeProperty");
var compareValue = Expression.Constant(value);
var equals = Expression.Equal(property, compareValue);
return Expression.Lambda<Func<T, bool>>(equals, param);
var param=Expression.Parameter(typeof(T),“x”);
var property=Expression.property(param,“SomeProperty”);
var compareValue=表达式常数(值);
var equals=表达式.Equal(属性,compareValue);
返回表达式.Lambda(等于,参数);

生成的表达式被传递给Linq
调用,其中
调用。像这样

 Context.Sources.Where(criteria.BuildQuery());
在计算/转换表达式时引发异常

如果我编译表达式,然后将委托传递给
Where
调用,那么一切都会按预期进行

 Context.Sources.Where(criteria.BuildQuery().Compile());

我不知道这有什么区别,如果有人知道为什么,请告诉我们

我开始时没有显式类型。但是它不起作用。我想你需要提供更多关于域名的信息。我刚刚在一个快速控制台应用程序中尝试过这一点,创建一个简单的等式表达式效果很好。当抛出异常时,T是什么类型?您的解决方案很好。我在一个快速控制台应用程序中进行了测试,它按预期工作。我真正的代码有点复杂。让我稍微修改一下我的问题,看看差距在哪里。谢谢。从中,我假设除了编译时常量之外,您不能创建
ConstantExpression
。这与您得到的错误消息一致,因为只有基元类型和枚举类型支持编译时常量。
value
的值来自哪里?您是否尝试过使用Reflector的表达式树查找?该值是DataContract的属性。它由WCF反序列化。然后,我使用反序列化对象来构建表达式。@FrankLiu我认为您可能使用了错误的表达式类型。虽然我不能完全确认,但我强烈怀疑
ConstantExpression
是用于编译时常量,例如
var a=5
var b=“你好!”
等等。@HighCore,我同意我使用了错误的表达式。我应该用哪一个?但是,如果我创建一个值对象,并在Christophano给出的解决方案中使用它,它就可以工作。这里有什么区别?
 Context.Sources.Where(criteria.BuildQuery());
 Context.Sources.Where(criteria.BuildQuery().Compile());