2016-12-30 83 views

回答

4

不能。要做到這一點,您需要一個Expression<Action>(請參閱MSDN中的Expression),並且不能將Action轉換爲Expression<Action>,而只能轉換爲其他方向。

Further reading

+0

這是我最初的構想。我需要它來序列化Action。 – Martin

1

你的意思是這樣的:

Action<int,int> act = (a,b) => new Program().Test(a,b); 

它可以被稱爲比爲act(1,2);

+1

我認爲問題是:給'act',如何檢索'1'和'2'? –

0

它不能使用Action可以做到,但lambda表達式也可以被視爲Expression<Action>,然後將它成爲可能。

注意,下面的代碼只適用於這種表達:它使用的是我們有一個方法調用的知識和我們使用常量作爲參數。

public class Program 
{ 
    public static void Main(string[] args) 
    { 
     var values = GetParams(() => Test(1, 2)); 
     foreach (var v in values) 
      System.Diagnostics.Debug.Print(v.ToString()); 
    } 

    private object[] GetParams<T>(Expression<Func<T>> expr) 
    { 
     var body = (MethodCallExpression)expr.Body; 
     var args = body.Arguments; 
     return args.Select(p => ((ConstantExpression)p).Value).ToArray(); 
    } 

    public int Test(int arg1, int arg2) 
    { 
     return arg1 + arg2; 
    } 
}