努力想出一个比较不同类型的数字对象的通用C#方法

时间:2009-04-29 11:59:02

标签: c# generics infragistics

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

答案 0 :(得分:4)

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

答案 1 :(得分:2)

你不能很好地利用泛型,因为你在编译时不知道数据类型。

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

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

这样做的好处是它还可以处理混合数据类型的案例,例如MinValueintvaluedouble时。

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