我在LinqPad中有这样的东西
void Main()
{
var t1 = DateTimeOffset.Parse("10/1/2012");
int? n1 = 1;
Expression<Func<Sample,bool>> x1 = ud =>
(ud.Date == t1 && ud.Number == n1);
x1.ToString().Dump();
}
class Sample
{
public int? Number{set;get;}
public DateTimeOffset Date{set;get;}
}
输出
ud =&gt; ((ud.Date == value(UserQuery +&lt;&gt; c_ DisplayClass0).t1)AndAlso (ud.Number == value(UserQuery +&lt;&gt; c _DisplayClass0).n1))
是否有任何可能的方法来保留变量,但输出的内容如下:
ud =&gt; ((ud.Date == Parse(“10/1/2012”))AndAlso(ud.Number == 转换(1)))
答案 0 :(得分:7)
我们走了;输出第一:
ud => ((ud.Date == 10/01/2012 00:00:00 +00:00) AndAlso (ud.Number == 1))
这永远不会输出Parse(...)
,因为你的表达式不包含一个解析:当你把它放到一个lambda中时,你已经评估了它。
另请注意,这会处理一个级别的捕获变量。对于更复杂(嵌套)的捕获上下文,您必须以递归方式从捕获类中获取值:
using System;
using System.Linq.Expressions;
using System.Reflection;
using System.Runtime.CompilerServices;
static class Program
{
static void Main()
{
var t1 = DateTimeOffset.Parse("10/1/2012");
int? n1 = 1;
Expression<Func<Sample, bool>> x1 = ud =>
(ud.Date == t1 && ud.Number == n1);
var sanitized = (Expression<Func<Sample, bool>>)
new Literalizer().Visit(x1);
Console.WriteLine(sanitized.ToString());
}
}
class Literalizer : ExpressionVisitor
{
protected override Expression VisitMember(MemberExpression node)
{
if(node.Member.DeclaringType.IsDefined(typeof(CompilerGeneratedAttribute), false)
&& node.Expression.NodeType == ExpressionType.Constant)
{
object target = ((ConstantExpression)node.Expression).Value, value;
switch (node.Member.MemberType)
{
case MemberTypes.Property:
value = ((PropertyInfo)node.Member).GetValue(target, null);
break;
case MemberTypes.Field:
value = ((FieldInfo)node.Member).GetValue(target);
break;
default:
value = target = null;
break;
}
if (target != null) return Expression.Constant(value, node.Type);
}
return base.VisitMember(node);
}
}
class Sample
{
public int? Number{set;get;}
public DateTimeOffset Date{set;get;}
}
答案 1 :(得分:0)
如果您可以依赖 Microsoft .NET Framework / CoreFX 的实现细节将在某个时间打破未来,看看下面的剧透盒中的内容:
有Expression.DebugView property。你需要做一些事情,比如通过反思找到它。
中所做的一样
它是implemented using an ExpressionVisitor,就像Marc Gravell's answer to this question.
我将再次强调这一点:这是一个私有财产。