获取表达式参数

本文关键字:参数 表达式 获取 | 更新日期: 2023-09-27 18:15:59

好的,问题是:

int a = 111;
int b = 222;
Expression<Func<int>> expr = ()=> someClass.SomeWork(a) + b + 1;
如你所见,有3个不同的参数: someeclass, a, b。它们都来自另一个执行范围,但有一个不是。我怎样才能得到它们呢?我的意思是,一般来说,我只需要作用域外的变量。

例如,我想这样使用:

var result = InvokeAndLog(expr);//this will invoke expression and print out everything I need from these arguments.

获取表达式参数

好了,伙计们,我自己找到了答案。这里是:

internal class Program
{
    public static int Method1()
    {
        return new Random(0).Next(10000);
    }
    public class MyClass
    {
        private int var = 11111;
        public int GetSome(int val)
        {
            return var * val;
        }
    }
    private static void Main()
    {
        var clas = new MyClass();
        int a = 111;
        int b = 222;
        Expression<Func<int>> expr = () => a * 2 - clas.GetSome(b) + b + 1 - Method1();
        var result = InvokeAndLog(expr);
    }
    private static T InvokeAndLog<T>(Expression<Func<T>> expr)
    {
        var visitor = new ArgumentsVisitor();
        visitor.Visit(expr);
        Console.WriteLine("Inputs: {0}", string.Join(", ", visitor.Arguments));
        return expr.Compile()();
    }
}

这里的主类是ExpressionVisitor后代。我只是重写了它的成员访问器,并将所有成员聚合到一个集合中:

    public class ArgumentsVisitor : ExpressionVisitor
    {
        private readonly HashSet<MemberInfo> _all = new HashSet<MemberInfo>();
        public IEnumerable<MemberInfo> Arguments
        {
            get { return _all; }
        }
        protected override Expression VisitMember(MemberExpression node)
        {
            _all.Add(node.Member);
            return base.VisitMember(node);
        }
    }

然后我把访问者应用到表达式中,打印出所有的变量!谢谢,microsoft =)