考虑以下代码块:

Expression<Func<string, bool>> pred;
{
    string s = "test";
    pred = x => x == s;
}
// how to retrieve the value of s from just pred?

此块之后作用域中的唯一变量是pred.仅使用pred,我们如何检索捕获的变量s的值?我可以通过展开pred的对象图来查看调试器中的值,但如何在代码中做到这一点呢?

推荐答案

您必须进行大量的强制转换才能得到ConstantExpression的基础值,因为编译器会将该值隐藏起来.

下面的代码通过BinaryExpression获取正确的 node ,判断正确的 node 是否为ConstantExpression,并使用正确 node 的FieldInfo来获得值:

var rightNodeMemberExpression = ((pred.Body as BinaryExpression).Right) 
                                    as MemberExpression;
var fieldInfo = rightNodeMemberExpression.Member as FieldInfo;

if (rightNodeMemberExpression.Expression is ConstantExpression exp)
{
    var val = exp.Value;
    var retrievedValue = fieldInfo.GetValue(val);

    Console.WriteLine(retrievedValue); // will output "test"
}

Csharp相关问答推荐

如何设置和接收自定义Visual Studio项目命令的参数

为什么在GuardationRule的收件箱函数中,decode.TryParse(valueString,out valueParsed)在给出1.0.1时返回true?

如何使用while循环实现异常处理

安装附加的. exe与Visual Studio

需要澄清C#的Clean Architecture解决方案模板的AuditableEntityInterceptor类

Unity中的刚体2D运动

try 在Blazor项目中生成html

REST API端点中异步后台代码执行的类型

如何在页面重新加载后保持菜单切换状态

由于POST中的应用程序/JWT,出现不支持的内容类型异常

如何捕获对ASP.NET核心应用程序的所有请求并将其发送到一个页面

如何让两个.NET版本不兼容的项目对话?

用于获取字符串的最后12个字符的正则表达式(空格除外)

如何在Polly重试策略成功之前将HttpClient请求排队?

使用未赋值的、传递的局部变量

未显示详细信息的弹出对话框

如何使用实体框架核心对字符串_agg使用强制转换为varchar(Max)

数据库操作预计影响1行,但实际影响0行; after _dbContext.SaveChanges();

如何使用LINQ在C#中填充列表列表?

.NET8支持Vector512,但为什么向量不能达到512位?