我有一个这样的方法:
public static bool IsPercentage<T>(T value) where T : IComparable
{
return value.CompareTo(0) >= 0 && value.CompareTo(1) <= 0;
}
我想用它来验证任何数字是否落在0 <= N <= 1的范围内。但是这仅适用于整数,因为CompareTo仅在相同的类型上运行。有没有不同的方法来做到这一点?
答案 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;
}