我在表单上有一个Infragistics UltraNumericEditor(版本5.3,很旧)控件。
如果我将.Value字段设置为小于.MinValue或大于.MaxValue的东西,那么我会抛出一个带有以下消息的System.Exception:
'Value'属性不能设置为超出'MinValue'和'MaxValue'属性确定的范围的值
UltraNumericEditor上相关字段的签名如下:
public object MinValue { get; set; }
public object MaxValue { get; set; }
public object Value { get; set; }
这可能会通过我们的代码库发生数百次,所以不要检查MinValue和MaxValue与我们每次尝试设置的值相比,我认为我是子类控件然后把支票放在那里:
public class OurNumericEditor : Infragistics.Win.UltraWinEditors.UltraNumericEditor
{
public object Value
{
get
{
return base.Value;
}
set
{
// make sure what we're setting isn't outside the min or max
// if it is, set value to the min or max instead
double min = (double)base.MinValue;
double max = (double)base.MaxValue;
double attempted = (double)value;
if (attempted > max)
base.Value = max;
else if (attempted < min)
base.Value = min;
else
base.Value = value;
}
}
}
显然,当值的类型MinValue和MaxValue可以转换为双精度时,这可以正常工作,但是当不可能时,我会期望InvalidCastException。
现在我可能只是在这里度过一个金发时刻,但我认为应该可以编写一个利用泛型来进行比较的方法,但我很难想象看起来像什么。
有任何想法或意见吗?
感谢
汤姆
答案 0 :(得分:4)
您可以简单地将所有内容都转换为IComparable并使用该界面进行比较。
答案 1 :(得分:2)
你不能很好地利用泛型,因为你在编译时不知道数据类型。
只需使用Convert
类将任何类型的数字数据转换为double
值:
double min = Convert.ToDouble(base.MinValue);
double max = Convert.ToDouble(base.MaxValue);
double attempted = Convert.ToDouble(value);
这样做的好处是它还可以处理混合数据类型的案例,例如MinValue
是int
且value
是double
时。
答案 2 :(得分:1)
泛型在这里不会帮助你,因为控件的Value属性也不是通用的。但是你可以使用IConvertible
接口将数字转换为比较所需的数字(例如双倍)。
答案 3 :(得分:1)
这在这里可能有点过头了,IComparable可能会在你的情况下做到这一点。
但是如果你真的想强烈键入你的控件接受的值,你应该写这样的东西:
public OurNumericEditor<T> : Infragistics.Win.UltraWinEditors.UltraNumericEditor
public T Value
{
get
{
return (T) base.Value;
}
set
{
// make sure what we're setting isn't outside the min or max
// if it is, set value to the min or max instead
double min = (double)MinValue;
double max = (double)MaxValue;
double attempted = // explicit conversion code goes here
if (attempted > max)
base.Value = max;
else if (attempted < min)
base.Value = min;
else
base.Value = value;
}
}
}