2012-10-05 42 views
7

有沒有一種簡單的方法來確定一個表達式是否包含一個不包含在例如MemberExpression中的ParameterExpression。查找表達式是否包含「孤獨」參數表達式

實施例:

x => x.Method() ? x : null < = 1 x的occurence而沒有任何進一步的評估x的

x => x.Method() ? x.Property : null < = 0 OCCURENCES而沒有任何進一步的評估

簡而言之我的使用情況是,我知道方法(沒有參數)和屬性值,並且想知道這是否足以評估表達式而不從存儲中獲取整個「對象」。

編輯: 我的例子可能是簡化。還有更多需要處理的表達式類型(例如UnaryExpression)。

x => ((Cast) x).Property < = 0 x的出現次數沒有任何進一步的評估

我在尋找的答案,以下問題:

給出的表達式,如果我知道的所有方法的返回值和屬性值輸入參數但不是參數值本身,我可以評估表達式嗎?

+0

什麼版本的.NET您使用的是? –

+0

它的.net 3.5(但我也有一個.net 4版本,我可以使用這個) – lindstromhenrik

回答

1

如果您使用的是.NET 4或更高版本,則可以使用ExpressionVisitor

我不太清楚你如何定義「寂寞參數」,但如果你想排除直接方法調用,會員訪問和索引訪問的參數,你可以使用像這樣(未經):

使用方法如下:

new MyExpressionVisitor().GetNumLonelyParameterExpressions(myExpression.Body) 

public class MyExpressionVisitor : ExpressionVisitor 
{ 
    private int numLonelyParameterExpressions; 

    public int GetNumLonelyParameterExpressions(Expression expression) 
    { 
     numLonelyParameterExpressions = 0; 
     Visit(expression); 
     return numLonelyParameterExpressions; 
    } 

    protected override Expression VisitParameter(ParameterExpression node) 
    { 
     // Every time we encounter a lonely parameter, increment. 
     numLonelyParameterExpressions++; 
     return base.VisitParameter(node); 
    } 

    protected override Expression VisitMethodCall(MethodCallExpression node) 
    { 
     // Don't visit parameters that have methods called on them. 
     var expr = (node.Object is ParameterExpression) 
      ? Expression.Default(node.Object.Type) 
      : node.Object; 

     // We need to make sure the arguments are visited though. 
     return base.VisitMethodCall(node.Update(expr, node.Arguments)); 
    } 


    protected override Expression VisitMember(MemberExpression node) 
    { 
      // Don't visit parameters with member accesses on them. 
      if (node.Expression is ParameterExpression) 
       return Expression.Default(node.Type); 

      return base.VisitMember(node); 
    } 

    protected override Expression VisitIndex(IndexExpression node) 
    { 
     // Same idea here. 
     var expr = (node.Object is ParameterExpression) 
      ? Expression.Default(node.Object.Type) 
      : node.Object; 

     return base.VisitIndex(node.Update(expr, node.Arguments)); 
    } 
} 
+0

這是我目前的做法(我有我自己的ExpressionVisitor 3.5)。然而,還有更多的表達式需要計數,我擔心我會錯過一些表達式。例如UnaryExpression:x =>((Cast)x).Property。 – lindstromhenrik

+0

@lindstromhenrik:我想你將不得不很好地定義'寂寞',就好像你包含那樣,它非常含糊。 – Ani

+0

我試圖給出一個更好的解釋,但我仍然不知道該怎麼稱呼這個問題;-) – lindstromhenrik

相關問題