Пытаясь придумать общий метод C #, который сравнивает различные типы числовых объектов - PullRequest
1 голос
/ 29 апреля 2009

У меня есть элемент управления Infragistics UltraNumericEditor (версия 5.3, довольно старая) в форме.

Если для поля .Value задать значение, меньшее, чем .MinValue, или значение, большее, чем .MaxValue, я получу исключение System.Exception со следующим сообщением:

Для свойства «Значение» нельзя установить значение, выходящее за пределы диапазона, определяемого свойствами «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 голосов
/ 29 апреля 2009

Вы можете просто привести все как IComparable и использовать этот интерфейс для сравнения.

2 голосов
/ 29 апреля 2009

Нельзя использовать дженерики, так как вы не знаете тип данных во время компиляции.

Просто используйте класс Convert для преобразования числовых данных любого вида в double значения:

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

Преимущество заключается в том, что он также обрабатывает случаи со смешанными типами данных, например, когда MinValue является int, а value является double.

1 голос
/ 29 апреля 2009

Это, вероятно, излишнее, и 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;
        }
    }
}
1 голос
/ 29 апреля 2009

Обобщения здесь вам не помогут, поскольку свойство Value элемента управления также не является универсальным. Но вы можете использовать интерфейс IConvertible для преобразования числа в то, что вам нужно для сравнения (например, удвоение).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...