我不得不被描述爲以下遠程服務的調用:如何使用參數序列化方法調用表達式?
var user = new User { Name = "check" };
WcfService<IMyService>.Call(s => s.MyMethod(1, "param", user, new Entity { ID = 2 }));
在我Call
的方法,我需要序列化這個方法調用JSON,這將是擺在WebSphere隊列:
{
"Interface": "IMyService",
"Method": "MyMethod",
"Arguments": [
1,
"param",
{
"Name": "check"
},
{
"ID": 2
}
]
}
我知道如何獲得界面和方法的名字,但我不能獲得非恆定值:
public static class WcfService<TInterface>
{
public static void Call(Expression<Action<TInterface>> expr)
{
var mce = (MethodCallExpression)expr.Body;
string interfaceName = typeof(TInterface).Name;
string methodName = mce.Method.Name;
var args = mce.Arguments
.Cast<ConstantExpression>()
.Select(e => e.Value)
.ToArray();
}
}
此代碼工作對於1
和"param"
,但不適用於user
和new Entity { ID = 2 })
,因爲它們分別是FieldExpression
和NewExpression
。如何獲得傳遞給函數調用的實際值,而不是它們的表達式表示?
更新:從suggested duplicate question的答案是不合適的,因爲我不想編譯我的表達式並執行它 - 我只需要評估參數。
從[獲取值的可能的複製ExpressionTrees](http://stackoverflow.com/questions/3457558/getting-values-from-expressiontrees) – yaakov
你不能得到非常量值,因爲它們可以鏈接到閉包或方法調用參數,它們將被評估表達式執行期間。所以在不知道它們的情況下,很難獲得它們的實際值 –