2009-07-03 3 views
2

Existe-t-il un moyen de forcer le compilateur C# à ignorer les surcharges d'opérateurs manquantes pour les objets, et à gérer à la place cette vérification en cours d'exécution? Je demande parce que j'ai un conteneur qui a plusieurs objets qui a divers attributs de type int, string, ushort et ainsi de suite. Je fais une fonction de recherche pour ce conteneur, et j'aimerais pouvoir effectuer des recherches dans différents domaines. J'utilise des prédicats et des expressions lambda (0).Comment faire pour que les objets "supposent" qu'ils ont été surchargés pour l'opérateur X?

C'est ce que je veux:

var data = container.Retrieve(ID => (ID == 5), Date => (Date > somedate)); 

en supposant ID et la date sont les champs dans les objets

du conteneur C'est ce que je dois faire aujourd'hui (Il fonctionne, cependant):

var data = container.Retrieve(ID => ((int)ID == 5), Date => ((DateTime)Date > somedate)); 

Ce casting supplémentaire n'est pas très beau par rapport au premier exemple, je ne voudrais pas avoir à le faire. Je voudrais avoir la possibilité de vérifier cela à l'exécution à la place.

Y a-t-il un moyen d'accomplir cela?

Répondre

3

Non, C# 3.0 n'a aucun support pour les opérateurs sans connaître le type.

En C# 4.0 vous pouvez le faire avec dynamic, mais c'est plus lent.

Dans votre cas, vous connaître ce que les types devraient être - donc juste cast (comme vous êtes).


Dans le cas plus général:

Avec des types inconnus, regardez Comparer.Default.Compare et object.Equals ...

Avec génériques; regarder Comparer<T>.Default.Compare(x,y) - qui devrait faire tout ce dont vous avez besoin pour >, >=, < et <= (y compris les nulls etc). De même, EqualityComparer<T>.Default.Equals(x,y) gère == et != (y compris les valeurs nulles, etc.).

Pour plus d'opérateurs (+, -, * etc) - regarde MiscUtil

+0

D'accord, je vais vivre avec mes moulages. Bravo pour la réponse rapide. :) – Hallgeir

+0

@Hallgeir: Si vous utilisez vos propres objets, ou si vous pouvez en dériver, vous pouvez utiliser la surcharge de l'opérateur de cast implicite. Je ne sais pas si cela peut être appliqué à votre situation. – Abel

Questions connexes