好的,问题在于:
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.
答案 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 =)