2013-10-28 6 views
0

I가 다음의 식숫자가 포함 된 ConstantExpression이 음수인지 확인하는 방법이 있습니까?

int someNumber = somevalue; 
ConstantExpression expr = Expression.Constant(someNumber); 

0 또는 expr이 음수 < expr에 있는지 확인하는 방법이 있나요?

+0

이 빌드 하시겠습니까 : 두 번째 예에서 사용 된

ConstantExpression expr = /* ... */; if (expr.Value != null && expr.Value.GetType().IsNumericType()) { // Perform an appropriate comparison _somehow_, but not necessarily like this // (using Convert makes my skin crawl). var decimalValue = Convert.ToDecimal(expr.Value); if (decimalValue < 0m) { /* do something */ } } 

확장 방법을 이 비교를 수행하는 _expression_ 또는 C# 코드에서 상수 값을 직접 분석하기를 원하십니까? –

+0

이 ConstantExpression에 숫자 값이 들어 있는지 (10 진수, int 또는 double과 같은) 분석하고 해당 값이 음수인지 확인하고 싶습니다. – fahadash

+0

예,하지만 C# 코드에서 직접이 분석을 수행 하시겠습니까? 아니면 해당 논리를 수행하는 표현식 트리를 작성 하시겠습니까? –

답변

2

상수의 형식을 알고있는 경우 기본 상수 값을 단순히 캐스팅하고 분석 할 수 있습니다. 당신은 모두가 Expression 경우

ConstantExpression expr = /* ... */; 
var intConstant = expr.Value as int?; 
if (intConstant < 0) { /* do something */ } 

물론, 당신은 그것을 ConstantExpression 여부를 확인하는 방법을 검사해야합니다.

당신은 유형을 알고하지 않습니다,하지만 당신은 유효한 숫자 유형 확인하려면 다음

public static Type GetNonNullableType([NotNull] this Type type) 
{ 
    if (type == null) 
     throw new ArgumentNullException("type"); 

    if (!type.IsGenericType || type.GetGenericTypeDefinition() != typeof(Nullable<>)) 
     return type; 

    return type.GetGenericArguments()[0]; 
} 

public static bool IsNumericType(this Type type) 
{ 
    if (type == null) 
     throw new ArgumentNullException("type"); 

    type = type.GetNonNullableType(); 

    if (type.IsEnum) 
     return false; 

    switch (Type.GetTypeCode(type)) 
    { 
     case TypeCode.SByte: 
     case TypeCode.Byte: 
     case TypeCode.Int16: 
     case TypeCode.UInt16: 
     case TypeCode.Int32: 
     case TypeCode.UInt32: 
     case TypeCode.Int64: 
     case TypeCode.UInt64: 
     case TypeCode.Single: 
     case TypeCode.Double: 
     case TypeCode.Decimal: 
      return true; 
    } 

    return false; 
} 
+1

에서 직접이 경우'as '를 사용하지 않을 것입니다. 값의 유형이 다른 경우 즉시 예외가 발생하기를 원할 것입니다. – svick

+2

OP가 바람직한 행동이나 유효한 입력으로 간주하는 것에 대해서는 전제하지 않습니다. 그는 음수를 분리하는 법을 물었습니다. 그는 모든 가치가 숫자 일 필요는 없다고 말했습니다. 예기치 않은 값을 확인하고 처리하는 방법을 가장 잘 결정하기 위해 그에게 맡깁니다. –