通用号码验证

时间:2014-02-05 20:18:41

标签: c# generics compareto

我有一个这样的方法:

public static bool IsPercentage<T>(T value) where T : IComparable
{
    return value.CompareTo(0) >= 0 && value.CompareTo(1) <= 0;
}

我想用它来验证任何数字是否落在0 <= N <= 1的范围内。但是这仅适用于整数,因为CompareTo仅在相同的类型上运行。有没有不同的方法来做到这一点?

2 个答案:

答案 0 :(得分:1)

您可以使用表达式树来执行此操作。考虑辅助,静态类

static class NumericHelper<T>
{
    public static T Zero { get; private set; }
    public static T One { get; private set; }

    static NumericHelper()
    {
        Zero = default(T);
        One = Expression.Lambda<Func<T>>(
                Expression.Convert(
                    Expression.Constant(1),
                    typeof(T)
                )
              ).Compile()();
    }
}

它在运行时生成(T)1强制转换,并将结果分配给One属性。因为静态构造函数仅在生成正确类型1值所需的代码将仅针对每个T执行一次时才会触发。

public static bool IsPercentage<T>(T value) where T : IComparable
{
    return value.CompareTo(NumericHelper<T>.Zero) >= 0 && value.CompareTo(NumericHelper<T>.One) <= 0;
}

Ofc,如果您尝试使用不支持T转换的(T)1类型调用它,则会失败。

答案 1 :(得分:1)

可以使用Convert.ToDecimal,那么你不需要是通用的:

public static bool IsPercentage(Object value)
{
    decimal val = 0;
    try
    {
        val = Convert.ToDecimal(value);
    }
    catch
    {
        return false;
    }
    return val >= 0m && val <= 1m;
}