获取表达式参数
本文关键字:参数 表达式 获取 | 更新日期: 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 =)