有没有办法检查包含数字的ConstantExpression是否为负数?

时间:2013-10-28 17:37:12

标签: .net expression-trees linq-expressions

我有以下表达式

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

有没有办法检查是否expr< 0或expr是负数?

1 个答案:

答案 0 :(得分:2)

如果您知道常量的类型,则可以简单地转换和分析基础常量值。

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

当然,如果您只拥有Expression,则需要检查它以确定 是否为ConstantExpression

如果您不知道类型,但想要检查任何有效的数字类型:

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 */ }
}

第二个例子中使用的扩展方法:

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