首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何验证表达式是否为成员访问lambda

如何验证表达式是否为成员访问lambda
EN

Stack Overflow用户
提问于 2020-03-10 22:41:29
回答 1查看 215关注 0票数 2

在接收表达式的函数中,如何检查表达式是否为成员访问lambda?

代码语言:javascript
复制
bool F<TSrc, TVal>(TSrc src, Expression<Func<TSrc, TVal>> exp) { 
  bool isMememberAccess = ???
  if (!isMememberAccess) return false;
  ...
  return true;
}

因此:

代码语言:javascript
复制
var emp = new Employee(); 
var res = F(emp, x => x.FirstName); // returns true;

var org = new Organization();
var res = F(org, x => x.Sales.Manager.FirstName); // returns true;

int i=0; 
var res = F(emp, x => i); // returns false - expression is not a member access

我试图检查exp.Body.NodeType == ExpressionType.MemberAccess,但这两种情况下都返回true。

有什么帮助吗?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2020-03-11 00:32:48

捕获的lambda变量存储在生成的struct类型中,作为静态常量传入。您的表达式参数x => i大致相当于;

代码语言:javascript
复制
    public struct locals
    {
        public int i;
    }
    var localState = new locals { i = i };
    Expression.Lambda<Func<Employee, int>>(
        Expression.MakeMemberAccess(
            Expression.Constant(localState, typeof(locals)),
            typeof(locals).GetField(nameof(locals.i))
        ),
        Expression.Parameter(typeof(Employee),"x")
    );

如您所见,这还包括一个成员表达式。要证明的是,成员表达式基于表达式参数的类型。

代码语言:javascript
复制
bool F<TSrc, TVal>(TSrc src, Expression<Func<TSrc, TVal>> exp) {
    var isMememberAccess = exp.Body is MemberExpression member
       && member.Expression is ParameterExpression parameter
       && parameter.Type == typeof(TSrc);
    ...
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/60626908

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档