获取表达式参数?

时间:2016-11-03 06:35:33

标签: c#

好的,问题在于:

int a = 111;
int b = 222;

Expression<Func<int>> expr = ()=> someClass.SomeWork(a) + b + 1;

如您所见,有3个不同的参数: someClass,a,b 。它们都来自另一个执行范围,但其中一个不是。我怎么能得到它们?我的意思是,一般来说,我只想要范围更广的变量。

例如,我想像这样使用它:

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

1 个答案:

答案 0 :(得分:0)

好的,伙计们,我找到了答案。这是:

Image img = new Image();
img.Source = new BitmapImage(new Uri("http://www.contoso.com/images/logo.png"));

这里的主要类是ExpressionVisitor后代。我刚刚覆盖了其成员访问者,并将所有成员汇总为单一集:

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()();
    }
}

然后我将访客应用于表达并打印出所有变量!谢谢,microsoft =)