2010-10-05 2 views
4

j'ai 2 variables de type objet qui doit être comparé à l'aide d'une opération dynamique qui repose sur un ENUM:Comparer les propriétés d'objet à l'aide d'une opération dynamique

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

Vous pouvez faire l'hypothèse que le type sous-jacent les variables sont les mêmes, ne peuvent être que de type chaîne, ou tout autre type de valeur, mais sont inconnues pendant le temps de développement.

J'ai actuellement les suivantes:

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(); 
} 

Quelle est la meilleure façon de déterminer un match à l'exécution (C# 4.0)?

Répondre

2

Avez-vous cela dans une méthode générique, ou pourriez-vous mettre dans une méthode générique? Si c'est le cas, c'est relativement simple: utilisez EqualityComparer<T>.Default pour les comparaisons d'égalité, et Comparer<T>.Default pour les comparaisons supérieures/inférieures (en utilisant un < 0 ou <= 0 pour moins que vs moins-que-ou-égal-à par exemple).

Si vous ne pouvez pas appeler directement d'une manière générique, vous pouvez utiliser le typage dynamique C# 4 pour le faire pour vous:

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); 
} 

Au moment de l'exécution, qui fonctionnera sur l'argument de type droit à utiliser pour CompareImpl.

Questions connexes