Сравнить свойства объекта с помощью динамической операции - PullRequest
4 голосов
/ 05 октября 2010

У меня есть 2 переменные типа object, которые необходимо сравнить с помощью динамической операции, основанной на перечислении:

public enum OperationType
{
    None,
    EqualTo,
    NotEqualTo,
    GreaterThan,
    GreaterThanOrEqualTo,
    LessThan,
    LessThanOrEqualTo          
}

Можно предположить, что базовый тип переменных одинаков, может иметь только строковый тип или любой другой тип значения, но неизвестен во время разработки.

В настоящее время у меня есть следующее:

 bool match;
 switch (Operation)
 {
      case OperationType.EqualTo:
           match = Equals(targetValue, valueToMatch);
           break;
      case OperationType.NotEqualTo:
           match = Equals(targetValue, valueToMatch) == false;
           break;
      case OperationType.GreaterThan:
           //??
           break;
      case OperationType.GreaterThanOrEqualTo:
           //??
           break;          
      case OperationType.LessThan:
           //??
           break;
      case OperationType.LessThanOrEqualTo:
           //??
           break;          
      default:
           throw new ArgumentOutOfRangeException();
 }

Каков наилучший способ определения соответствия во время выполнения (C # 4.0)?

1 Ответ

2 голосов
/ 05 октября 2010

У вас есть это в универсальном методе, или вы могли бы поместить в универсальном методе? Если это так, то это относительно просто: используйте EqualityComparer<T>.Default для сравнений на равенство и Comparer<T>.Default для сравнений больше / меньше (используя < 0 или <= 0 для значений меньше, чем меньше или равно- к примеру).

Если вы не можете вызвать его напрямую общим способом, вы можете использовать динамическую типизацию C # 4, чтобы сделать это за вас:

private static bool CompareImpl<T>(T value1, T value2, OperationType operation)
{
    // Stuff using generics
}

public static bool Compare(dynamic value1, dynamic value2,
                           OperationType operation)
{
    return CompareImpl(value1, value2, operation);
}

Во время выполнения это отработает правильный аргумент типа, который будет использоваться для CompareImpl.

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