2017-03-10 46 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;}'。 –