我怎樣才能得到像這樣的字符串
Namespace.IMyService.Do("1")
從這個剪輯中演示的表達式:
IMyService myService = ...;
int param1 = 1;
myExpressionService.Get(c => myService.Do(param1));
我實際上不想調用Do
除非使用生成的字符串滿足條件。
您將不得不遍歷Expression trees
。以下是一些示例代碼:
internal static class myExpressionService
{
public static string Get(Expression<Action> expression)
{
MethodCallExpression methodCallExpression = (MethodCallExpression)expression.Body;
var method = methodCallExpression.Method;
var argument = (ConstantExpression) methodCallExpression.Arguments.First();
return string.Format("{0}.{1}({2})", method.DeclaringType.FullName, method.Name, argument.Value);
}
}
如果以這種方式調用它可以工作: string result = myExpressionService.Get(() => myService.Do(1));
輸出是: Namespace.IMyService.Do(1)
您可以擴展/更新它以處理您的方案。
這也有用(雖然不是特別優雅):
public static string MethodCallExpressionRepresentation(this LambdaExpression expr)
{
var expression = (MethodCallExpression)expr.Body;
var arguments = string.Join(", ", expression.Arguments.OfType<MemberExpression>().Select(x => {
var tempInstance = ((ConstantExpression)x.Expression).Value;
var fieldInfo = (FieldInfo)x.Member;
return "\"" + fieldInfo.GetValue(tempInstance).ToString() + "\"";
}).ToArray());
return expression.Object.Type.FullName + "." + expression.Method.Name + "(" + arguments + ")";
}
你可以這樣稱呼它:
Expression<Action> expr = c => myService.Do(param1));
var repr = expr.MethodCallExpressionRepresentation(); // Namespace.IMyService.Do("1")