1
我的任務是根據幾個規則修改Expression
。其中之一是刪除頂級轉換表達式,如果有這樣的,但只有頂級,而不是內部。我實現了流動類如何從表達式樹中只刪除頂層節點?
class RemoveConvertToObjectExpressionVisitor : ExpressionVisitor
{
protected override Expression VisitUnary(UnaryExpression node)
{
if (node.NodeType == ExpressionType.Convert || node.NodeType == ExpressionType.ConvertChecked)
{
return base.Visit(node.Operand);
}
return base.VisitUnary(node);
}
}
但它刪除所有的轉換表達式。看下面的例子(它只是一個行爲的樣本,在代碼本身沒什麼意義)。
class Model
{
public int Value { get; set; }
}
void Main()
{
Expression<Func<Model, object>> expression = m => m.Value + int.Parse(((object) "5").ToString());
var visitor = new RemoveConvertToObjectExpressionVisitor();
var result = visitor.Visit(expression.Body);
}
我想要的結果表現爲m.Value + Parse(Convert("5").ToString())
,但它給m.Value + Parse("5".ToString())
第二個建議似乎很好,但它不能編譯 - 給''不能轉換類型'System.Linq.Expressions.Expression>'改爲'System.Linq.Expressions.UnaryExpression'' –
@PavelK改變後的答案應該更好。它使用你的訪客。但是,它假定您始終以頂級lambda表達式開始。 – dasblinkenlight
現在,當我嘗試我的例子'var v = new RemoveConvertToObjectExpressionVisitor(); v.Visit(表達式);''我得到'ArgumentException''類型'System.Int32'的表達式不能用於返回類型'System.Object'。 –