Je me attends à une surcharge est votre meilleure option ici:
string Add(object value, MyStruct1 expiration) {...}
string Add(object value, MyStruct2 expiration) {...}
Ceci est d'autant plus approprié que vous ne pouvez pas sous-classer une structure, donc le seulement viable T
dans votre exemple seraitMyStruct1
et MyStruct2
- peut également avoir des méthodes spécifiques, alors. Ré-limiter les génériques à plusieurs types cités; pas vraiment - et même s'il y en avait, le nom "Add" suggère que vous voulez utiliser le support de l'opérateur, qui aussi n'est pas en C# (3.0). Cependant, en C# 4.0, dynamic
peut être une option ici - cela agit comme une forme optimisée de dactylographie; vous n'obtiendrez pas le support du compilateur (validation, etc), mais cela devrait fonctionner. Vous jetterait à l'intérieur dynamic
la méthode:
string Add<T>(object value, T expiration) where T : struct {
dynamic valueDyn = value;
valueDyn += expiration; // or similar
// more code
}
Une autre option (.NET 3.5) est d'utiliser le Operator
support dans MiscUtil, en utilisant Operator.Add
ou Operator.AddAlternative
.
Je suis d'accord que cela devrait être réalisé avec des interfaces. C'est l'un des buts d'une interface! – Henri
Merci pour votre réponse - s'il vous plaît pouvez-vous expliquer l'importance de ne pas être en mesure de sous-classer le type? Contraindre le paramètre à structs (types de valeur) semble possible et contradictoire à votre déclaration. Les structs que je souhaite contraindre sont DateTime ou TimeSpan, donc envelopper ceux-ci dans une interface semblerait être la seule solution (ou laisser un générique). – Ben
Vous ne pouvez pas appliquer une nouvelle interface sur une structure que vous ne contrôlez pas ('DateTime',' TimeSpan' etc), donc non: vous ne pouvez pas le faire. –