- r - 以节省内存的方式增长 data.frame
- ruby-on-rails - ruby/ruby on rails 内存泄漏检测
- android - 无法解析导入android.support.v7.app
- UNIX 域套接字与共享内存(映射文件)
我正在解析表达式树。给定 ExpressionType.MemberAccess 的 NodeType,如何获取该字段的值?
来自 C# MSDN 文档:MemberAccess 是表示从字段或属性读取的节点。
一段代码会非常非常有用。提前致谢!!!
我的代码看起来像这样:
public static List<T> Filter(Expression<Func<T, bool>> filterExp)
{
//the expression is indeed a binary expression in this case
BinaryExpression expBody = filterExp.Body as BinaryExpression;
if (expBody.Left.NodeType == ExpressionType.MemberAccess)
//do something with ((MemberExpressionexpBody.Left).Name
//right hand side is indeed member access. in fact, the value comes from //aspdroplist.selectedvalue
if (expBody.Right.NodeType == ExpressionType.MemberAccess)
{
//how do i get the value of aspdroplist.selected value?? note: it's non-static
}
//return a list
}
最佳答案
[为清楚起见更新]
首先;类型转换 Expression
到 MemberExpression
.
A MemberExpression
有两件事很有趣:
PropertyInfo
/FieldInfo
给成员(member)即如果你能评估.Expression
到“obj”,以及 .Member
是 FieldInfo
, 然后你可以通过 .GetValue(obj)
得到实际值在 FieldInfo
上(和 PropertyInfo
非常相似)。
问题是评估 .Expression
非常棘手;-p
显然,如果结果是 ConstantExpression
,你就走运了。 - 但在大多数情况下不是;它可能是 ParameterExpression
(在这种情况下,您需要知道要评估的实际参数值),或 Expression
的任何其他组合
在许多情况下,一个简单(也许是懒惰)的选择是使用 .Compile()
让 .NET 框架来完成繁重的工作;然后,您可以将 lambda 评估为类型化委托(delegate)(传入 lambda 需要的任何参数)。然而,这并不总是一种选择。
为了展示这有多复杂;考虑这个简单的例子(我在每一步都进行了硬编码,而不是测试等):
using System;
using System.Linq.Expressions;
using System.Reflection;
class Foo
{
public string Bar { get; set; }
}
static class Program
{
static void Main()
{
Foo foo = new Foo {Bar = "abc"};
Expression<Func<string>> func = () => foo.Bar;
MemberExpression outerMember = (MemberExpression)func.Body;
PropertyInfo outerProp = (PropertyInfo) outerMember.Member;
MemberExpression innerMember = (MemberExpression)outerMember.Expression;
FieldInfo innerField = (FieldInfo)innerMember.Member;
ConstantExpression ce = (ConstantExpression) innerMember.Expression;
object innerObj = ce.Value;
object outerObj = innerField.GetValue(innerObj);
string value = (string) outerProp.GetValue(outerObj, null);
}
}
关于c# - 给定类型 ExpressionType.MemberAccess,如何获取字段值?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/238765/
我的印象是在 lambda 表达式中不可能赋值。例如,以下(诚然不是很有用)代码 Expression> expr = (x, y) => y = x; 产生编译错误 An expression tr
长话短说 如何创建一个表达式,其中 Expression.NodeType == ExpresionType.IsTrue || ExpresionType.IsFalse 背景信息 我正在创建 En
我正在解析表达式树。给定 ExpressionType.MemberAccess 的 NodeType,如何获取该字段的值? 来自 C# MSDN 文档:MemberAccess 是表示从字段或属性读
我正在编写评估 .NET Expression 树的代码。我正在尝试创建一个 C# 4 测试来练习我对 ExpressionType.Index 的处理,但我不知道如何通过 LambdaExpress
我正在查看来自 HomeKit Catalog: Creating Homes, Pairing and Controlling Accessories, and Setting Up Trigger
System.Linq.Expressions.ExpressionVisitor 有一个名为 VisitExtension 的方法,它似乎除了在表达式被访问。 protected internal
我是一名优秀的程序员,十分优秀!