Как создать класс или набор классов, представляющих значение, будь то целое число или строка или список строк - PullRequest
0 голосов
/ 27 октября 2011

Как я могу представить в классе нечто, представляющее значение.

Это значение будет использоваться для записи операций сравнения, таких как EqualTo, GreaterThan и т. Д.

Теперь выгода: значение может иногда быть целым числом, строкой или даже списком целых чисел или строк.

Как я мог бы представить это в классе или группах классов (возможно, наследуя от базового класса)

Могу ли я написать один метод, например:

EqualTo(IValue value, IValue otherValue)

Как теперь мог бы обрабатываться этот метод EqualTo, если я передал строку, или список строк, дату / время или список даты и времени и вернул соответственно true / false? Примечание:

Смысл в том, что я буду строить эти объекты из данных, поступающих из базы данных, поэтому фактический тип данных, значение или значения и т. Д.

Ответы [ 2 ]

2 голосов
/ 27 октября 2011

Вы можете написать:

EqualTo<T>(T value1, T value2) where T : IEquatable<T>

или больше и меньше:

Compare<T>(T value1, T value2) where T : IComparable<T>

Оба из них были бы довольно просты, учитывая IComparable<T> и IEquatable<T>:)

Вам потребуются отдельные перегрузки (или другие методы) для обработки последовательности таких значений:

SequenceEqualTo<T>(IEnumerable<T> sequence1, IEnumerable<T> sequence2)
    where T : IEquatable<T>


SequenceCompare<T>(IEnumerable<T> sequence1, IEnumerable<T> sequence2)
    where T : IComparable<T>

В качестве альтернативы, если вы не хотите использовать общее ограничение, вы можете использовать Comparer<T>.Default и EqualityComparer<T>.Default.

Если вы хотите обрабатывать последовательности в тех же методах, что и непоследовательности, вы всегда можете проверить, реализовано ли T IEquatable<T> и, если нет, реализовано ли IEnumerable<TElement> для некоторых TElement, в которых реализовано IEquatable<TElement> , Заметьте, это будет довольно запутанно ...

РЕДАКТИРОВАТЬ: Хорошо, если вы собираетесь давать эти вещи динамически ...

  • Сначала выясните, являются ли они списками или нет. Вы захотите разобраться с этим отдельно. Предполагая, что это действительно List<T>, вы можете сделать:

    if (value1.GetType().IsGenericType &&
        value1.GetType().GetGenericTypeDefinition() == typeof(List<>))
    {
        // Handle this case separately, definitely in another method.
        // It'll be a pain.
    }
    
  • В противном случае просто используйте обычный вызов Equals() для проверки на равенство и приведите значение к неуниверсальному типу IComparable для значения больше / меньше. Это не идеально, но должно работать ...

0 голосов
/ 27 октября 2011

Другим подходом было бы убедиться, что ваши типы реализуют IComparable и используют его CompareTo () метод.

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