1

我在表单上有一个 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。

现在我可能只是在这里度过了一个金发碧眼的时刻,但我认为应该可以编写一种利用泛型进行比较的方法,但我正在努力想象这可能是什么样子。

有什么想法或意见吗?

谢谢
汤姆

4

4 回答 4

4

您可以简单地将所有内容转换为IComparable并使用该接口进行比较。

于 2009-04-29T12:03:56.880 回答
2

您无法充分利用泛型,因为您在编译时不知道数据类型。

只需使用Convert该类将任何类型的数字数据转换为double值:

double min = Convert.ToDouble(base.MinValue);
double max = Convert.ToDouble(base.MaxValue);
double attempted = Convert.ToDouble(value);

这样做的好处是它还可以处理混合数据类型的情况,例如 when MinValueis anintvalueis a double

于 2009-04-29T12:09:16.960 回答
1

泛型在这里对您没有帮助,因为控件的 Value 属性也不是通用的。但是您可以使用IConvertible界面将数字转换为比较所需的数字(例如双精度数)。

于 2009-04-29T12:05:58.527 回答
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;
        }
    }
}
于 2009-04-29T12:11:28.140 回答