當我只有Action委託時,如何獲取參數1和2?從lambda表達式創建的操作獲取參數
public class Program
{
public static void Main(string[] args)
{
Action act =() => new Program().Test(1, 2);
}
public void Test(int arg1, int arg2)
{
}
}
當我只有Action委託時,如何獲取參數1和2?從lambda表達式創建的操作獲取參數
public class Program
{
public static void Main(string[] args)
{
Action act =() => new Program().Test(1, 2);
}
public void Test(int arg1, int arg2)
{
}
}
您不能。要做到這一點,您需要一個Expression<Action>
(請參閱MSDN中的Expression),並且不能將Action
轉換爲Expression<Action>
,而只能轉換爲其他方向。
你的意思是這樣的:
Action<int,int> act = (a,b) => new Program().Test(a,b);
它可以被稱爲比爲act(1,2);
我認爲問題是:給'act',如何檢索'1'和'2'? –
它不能使用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;
}
}
這是我最初的構想。我需要它來序列化Action。 – Martin