1
比方說,我有這樣的表達:遞歸檢查LINQ表達式
e => e.Name.StartsWith(GetArgument())
凡GetArgument()
定義如下:
public string GetArgument() { return "Lu"; }
我想這個表達式被翻譯成以下字符串:
"begins_with(Name, Lu)"
我開發了一個表達式訪問器來訪問rec中的每個子表達式ursive方式:
public class MyExpressionTranslator : ExpressionVisitor, IExpressionTranslator<string>
{
// ....
//Implementing IExpressionTranslator<string>
public string Translate(Expression expr)
{
//Begin visiting the expression and its sub expressions
base.Visit(expr);
// I need to return the string here
return null;
}
// Overrides method from base class ExpressionVisitor
protected override MethodCallExpression VisitMethodCall(MethodCallExpression expr)
{
//This method is called when a method call sub expression is visited
//For example, I can check if the method being called is "StartsWith"
if(expr.Method.Name == "StartsWith")
{
// I have no idea what to do here
}
//Proceeds to visit this expression's sub expressions
return base.VisitMethodCall(expr);
}
}
如下我會用這個類:
MyExpressionTranslator translator = // new MyExpressionTranslator(...)
Expression<Func<SomeClass, bool>> expr = e => e.Name.StartsWith(GetArgument());
string result = translator.Translate(expr);
// result should be "begins_with(Name, Lu)"
提供了我的基類具有用於每個表達式類型一個virtual
訪問方法(可能是一個常數,一個參數,一個方法調用,或任何其他),我該如何構建預期的字符串輸出?
您正在爲特定情況提供預期輸出。其他情況下,例如屬性訪問或循環可能如何? –
@YacoubMassad其實,我打算將這個特定的案例解決方案擴展到任何其他用例。這裏的核心問題是我不知道如何遞歸地創建字符串。一旦解決了,我可以設法做其他事情。 –
提示:使用私有字段StringBuilder。 –