2017-03-10 75 views
0

在我的程序中,我有一個System.Linq.Expressions.Expression對象的列表。 此列表可以包含不同類型的特定Expression。例如BinaryExpression,ConditionalExpression等(參見https://msdn.microsoft.com/en-us/library/system.linq.expressions.expression(v=vs.110).aspx)。 當閱讀此列表時,我想檢查它是哪種類型的ExpressionBinaryExpressionConditinalExpression等)。獲取System.Linq.Expressions.Expression對象的類型

如何獲取派生Expression類的名稱/類型?

UPDATE

這裏措辭列表中的定義:

IEnumerable<Expression<Func<T, object>>> Expressions { get; } 

和代碼來獲取表達式:

foreach (var expression in test.Expressions) 
{ 
    var test = expression.GetType().ToString(); //System.Linq.Expressions.Expression`1[System.Func`2[TestObject,System.Object]] 
} 
+0

你使用過GetType()嗎?它會給你任何對象的確切的運行時類型。應該使用表達式以及 –

+0

我試過了。它給了我只有「System.Linq.Expressions.Expression」 – Palmi

+0

顯示你的代碼的一個例子。你也可以使用「is」操作符。 'yourObj是BynaryExpression' - 會給你一個布爾結果 –

回答

1

您必須

expression.Body.GetType(); 

什麼你是外表ng at是Expression<Func<,>>,你感興趣的是它的.Body

+1

+1,但是OP應該注意到'Body'的類型可能是一個私有實現類型,所以對於某些使用'是'如果你想要例如是必要的識別一個'BlockExpression'而不是'ScopeN'(當它有多個子表達式時使用的'BlockExpression'的實現,具有變量並且沒有明確設置爲除最後一個子類型以外的類型)。只有哪些私有實現類型存在以及何時使用它們隨框架版本而變化,因此強依賴性是不可取的。 –

+0

@JonHanna是的......你應該總是使用'is'或'NodeType'屬性,因爲一大塊表達式樹是建立在各種'BinaryExpression' /'UnaryExpression'的私有子類之上的... – xanatos

+0

一些用法也可以很好的使用'var type = GetType(); while(!type.IsPublic){type = type.BaseType;}'。 –