1

フォームにInfragisticsUltraNumericEditor(バージョン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をdoubleにキャストできる場合、これは明らかに正常に機能しますが、それが不可能な場合は、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);

MinValueこれには、がintとである場合など、データ型が混在するケースも処理できるという利点がvalueありdoubleます。

于 2009-04-29T12:09:16.960 に答える
1

コントロールのValueプロパティもジェネリックではないため、ジェネリックはここでは役に立ちません。ただし、IConvertibleインターフェイスを使用して、数値を比較に必要な数値に変換することもできます(たとえば、double)。

于 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 に答える