- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
给定 Msdn:常量表达式是可以在编译时完全求值的表达式。
但是在下面的示例代码中,我有一个无法在编译时求值的 contantExpression。
我应该错过了什么,但是什么?
public class SomeClass
{
public string Key { get; set; }
}
public static void Sample()
{
var wantedKey = Console.ReadLine();
Expression<Func<SomeClass, bool>> expression = c => c.Key == wantedKey;
var maybeAConstantExpression = ((MemberExpression)((BinaryExpression)expression.Body).Right).Expression;
//Both are true, so we have a constantExpression,righ and Value should be known
Console.WriteLine(maybeAConstantExpression.NodeType == ExpressionType.Constant);
Console.WriteLine(maybeAConstantExpression.GetType() == typeof(ConstantExpression));
var constantExpression = ((ConstantExpression)maybeAConstantExpression);
var constantValue = constantExpression.Value;
//ConsoleApplication1.Program+<>c__DisplayClass0
//Do not looks like a constant..this is a class...
Console.WriteLine(constantValue);
var fakeConstantValue = constantValue.GetType().GetField("wantedKey").GetValue(constantValue);
//Return the value entered whith Console.ReadLine
//This is not really known at compile time...
Console.WriteLine(fakeConstantValue);
}
最佳答案
const
是可以在编译时求值的东西。 ConstantExpression
仅仅代表一个固定值。这可能来自编译时,但这不是必需的,而且通常也不是。
常量表达式(在 C# 语言意义上)和 ConstantExpression
(运行时对象)之间存在差异。
您的情况中的 constantValue
代表捕获上下文 - 提升 wantedKey
的静默类。基本上,该代码是(通过编译器):
class HorribleNameThatYouCannotSay {
public string wantedKey; // yes, a public field
}
...
static void Sample()
{
var ctx = new HorribleNameThatYouCannotSay();
ctx.wantedKey = Console.ReadLine();
var p = Expression.Parameter(typeof(SomeClass), "c");
Expression<Func<SomeClass, bool>> expression =
Expression.Lambda<Func<SomeClass, bool>>(
Expression.Equal(
Expression.PropertyOrField(p, "Key"),
Expression.PropertyOrField(
Expression.Constant(ctx), "wantedKey")
), p);
);
}
或者非常接近的东西
但它可能只是:
string wantedKey = Console.ReadLine();
var p = Expression.Parameter(typeof(SomeClass), "c");
Expression<Func<SomeClass, bool>> expression =
Expression.Lambda<Func<SomeClass, bool>>(
Expression.Equal(
Expression.PropertyOrField(p, "Key"),
Expression.Constant(wantedKey, typeof(string))
), p);
如果您使用 Expression
API 手动编写它(即像上面那样)
关于c# - ConstantExpression 不是常量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17443884/
给定Msdn:常量表达式是可以在编译时完全计算的表达式。 但是在下面的示例代码中,我有一个无法在编译时评估的 contantExpression。 我应该错过一些东西,但是什么? public cla
给定 Msdn:常量表达式是可以在编译时完全求值的表达式。 但是在下面的示例代码中,我有一个无法在编译时求值的 contantExpression。 我应该错过了什么,但是什么? public cla
当 ConstantExpression 值为 null 时,如何确定它的类型?我以前一直使用以下代码检测类型,但是当 ConstantExpression 值为 null 时它会导致 null 异常
我正在寻找一个值 var guid = Guid.Parse("SOMEGUID-GUID-GUID-GUID-SOMEGUIDGUID"); Expression> selector = x =>
我创建了一个覆盖 VisitConstant 的 ExpressionVisitor 实现。但是,当我创建一个使用局部变量的表达式时,我似乎无法获得该变量的实际值。 public class Pers
无论怎么想,我都不是表达式树大师,我拥有的代码如下所示: int external = 10; using(var session = new Session()) {
我尝试实现自己的表达式序列化器/反序列化器,以便通过服务传递它(我想实现我自己的 EF Core 服务端点)。所以,现在我对 LambdaExpressions 中的集合有问题。例如, var dat
我尝试实现自己的表达式序列化器/反序列化器,以便通过服务传递它(我想实现我自己的 EF Core 服务端点)。所以,现在我对 LambdaExpressions 中的集合有问题。例如, var dat
我有一些代码生成表达式作为数据库中读取的“where”语句传递,我正在尝试加快速度。 下面的示例使用 where 语句来匹配具有传入值的表的 PK: private Expression MakeWh
下面是我的问题的简单演示代码。 [TestClass] public class ExpressionTests { [TestMethod] public void TestPara
这个问题在 NHibernate 2 和 3 中都会出现。我有一个类 A,它有一个类 B 的成员集。直接查询类可以很好地执行。但是,当我将涉及类 B 的表达式之一传递到方法中时,出现以下错误: Sys
这个问题在 NHibernate 2 和 3 中都会出现。我有一个类 A,它有一个类 B 的成员集。直接查询类可以很好地执行。但是,当我将涉及类 B 的表达式之一传递到方法中时,出现以下错误: Sys
我是一名优秀的程序员,十分优秀!