【问题标题】:Get type of System.Linq.Expressions.Expression object获取 System.Linq.Expressions.Expression 对象的类型
【发布时间】:2017-03-10 14:49:35
【问题描述】:

在我的程序中,我有一个 System.Linq.Expressions.Expression 对象列表。 此列表可以包括不同类型的特定Expression。例如BinaryExpressionConditionalExpression 等(参见https://msdn.microsoft.com/en-us/library/system.linq.expressions.expression(v=vs.110).aspx)。 阅读此列表时,我想检查Expression 的具体类型(BinaryExpressionConditinalExpression 等)。

如何获取派生的Expression 类的名称/类型?

更新

这里是表达式列表的定义:

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]]
}

【问题讨论】:

  • 你试过 GetType() 吗?它将为您提供任何对象的确切运行时类型。也应该与表达式一起使用
  • 我试过了。它只给了我“System.Linq.Expressions.Expression”
  • 显示您的代码示例。您也可以使用“is”运算符。 yourObj is BynaryExpression - 会给你一个布尔结果
  • include.GetType() 来自哪里?你应该做expression.GetType()(你的foreach代码变量)
  • @Gonzalo 对不起。错字。是表达。我试图简化我的代码...

标签: c# .net linq expression-trees


【解决方案1】:

你必须

expression.Body.GetType();

您查看的是Expression&lt;Func&lt;,&gt;&gt;,您感兴趣的是它的.Body

【讨论】:

  • +1,但 OP 应注意 Body 的类型可能是私有实现类型,因此对于某些用途,如果您想使用 is 进行测试是必要的,例如识别BlockExpression 而不是ScopeNBlockExpression 的实现在它有多个子表达式、有变量并且没有明确设置为除最后一个子类型之外的其他类型时使用)。存在哪些私有实现类型以及何时使用它们也因框架版本而异,因此不建议强依赖。
  • @JonHanna 是的...您应该始终使用isNodeType 属性,因为大量的表达式树是建立在各种BinaryExpression/@987654332 的私有子类之上的@/...
  • 有些用途也可以用var type = GetType(); while (!type.IsPublic){type = type.BaseType;}
猜你喜欢
  • 2015-10-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-09-24
相关资源
最近更新 更多