2017-03-10 10 views
0

내 프로그램에는 System.Linq.Expressions.Expression 개체 목록이 있습니다. 이 목록에는 다양한 유형의 특정 Expression이 포함될 수 있습니다. 예를 들어, BinaryExpression, ConditionalExpression 등 (https://msdn.microsoft.com/en-us/library/system.linq.expressions.expression(v=vs.110).aspx 참조). 이 목록을 읽을 때 Expression의 특정 유형 (BinaryExpression, ConditinalExpression 등)을 확인하고 싶습니다.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 is BynaryExpression'입니다 - 부울 결과를 줄 것입니다 –

답변

1

당신이해야

expression.Body.GetType(); 

무엇 너는 표정이었다. ng는 Expression<Func<,>>이고, 관심있는 내용은 .Body입니다.

+1

+1이 아니기 때문에 "is"연산자를 사용할 수 없지만 OP는 'Body'유형이 개인 구현 유형일 수 있음을 알아야합니다. 따라서 일부 사용에서는 ' 당신이 원하면 예식이 필요합니다. 'ScopeN' (하나 이상의 자식 표현이 있고, 변수를 가지며 마지막 자식의 타입이 아닌 다른 타입으로 명시 적으로 설정된 타입을 가지지 않을 때 사용되는'BlockExpression'의 구현)보다는'BlockExpression'을 식별하십시오. 사적인 구현 유형이 존재하고 사용되는시기는 프레임 워크 버전에 따라 다르므로 강력한 종속성은 권장 할만한 것이 아닙니다. –

+0

@JonHanna 예 ... 다양한'BinaryExpression' /'UnaryExpression'/... – xanatos

+0

의 개인 하위 클래스에 큰 표현식 트리가 만들어지기 때문에 항상'is' 또는'NodeType' 속성을 사용해야합니다. 어떤 것을 사용하면'var type = GetType(); 동안 (! type.IsPublic) {type = type.BaseType;}'. –