J'utilise la boîte à outils étendue WPF ( http://wpftoolkit.codeplex.com/ ). p>
Il a un bon contrôle numericupDown que j'aimerais utiliser, mais il utilise en interne il utilise des doubles - ce qui signifie qu'il utilise double.Minvalue et double.MAXValue. P>
J'aimerais utiliser le même contrôle, mais j'ai besoin d'une version générique - pour l'INT, il doit utiliser Int.MaxValue / Minvalue, pour floatts flottant.MAXValue / Minvalue, etc. (je pense que vous avez l'idée: ))) p>
Donc, je pense à la copie du numericupDown à un gnoméric Mais cela ne fonctionne pas, car un type générique n'a pas de mintaillée / maxvalue. Et normalement j'utiliserais la clause "Où" pour spécifier un type de base, mais cela ne fonctionne pas comme Afaik, il n'y a pas d'interface commune qui définit "Minvalue" et "maxvalue". P>
Y a-t-il un moyen de résoudre ce problème avec des génériques, ou est-ce que j'ai vraiment besoin de copier / coller / rechercher et de remplacer le numérique d'origine pour chaque type? p>
4 Réponses :
Eh bien, étant donné que vous pouvez obtenir au type au moment de l'exécution, vous pourriez EM> s'appuyer sur le fait que tous les types numériques dans .NET ont Notez que si vous utilisez cela avec un type inapproprié, j'ai essayé de forcer une erreur de compilation de la compilée de mieux que je peut ... mais ce ne sera pas infaillible. Si vous parvenez à trouver une structure avec toutes les interfaces appropriées, mais sans Minvalue code> et < Code> Maxvalue code> champs et lisez-les avec réflexion. Ce ne serait pas terriblement agréable, mais assez facile à faire:
Minvalue code> et
Maxvalue code>, alors toute tentative d'utilisation de
numericupdown code> avec ce type provoquera une exception pour être lancée. P> p>
L'échantillon serait extrêmement apprécié! :) Au fait, Jon, en juger par votre responsable - êtes-vous superhumain par hasard? Vous semblez tout d'abord savoir que peut-être pas tout, mais quelque chose près de cela - et vous semblez toujours être là quand quelqu'un comme moi est en difficulté :) acclamations :)
@IUSEDTOBEAPPYGMY: Tu n'étais que chanceux :) Je pense que je suis sur le point de sortir du net pour la nuit ...
Jon - Tout d'abord, merci pour l'entrée brillante - je ne l'ai pas encore testée, mais même si cela ne compilait pas, vous m'avez donné une toute nouvelle direction à penser :) Mais juste pendant que j'ai votre attention;) - Je veux utiliser ces contrôles dans mon xaml. Mon idée était de créer une version générique, puis de créer des classes vides comme NumericupDownint: gnumericupdown
@IUSEDTOBEAPYGMY: J'ai bien peur de ne pas avoir aucune idée de la qualité des génériques et du mélange XAML. Vous mai i> trouver cela pratique d'avoir une classe de base générique, puis des sous-types de décimalupdown code>,
int32uppoddown code> etc. pour rendre le xaml plus simple. Vaut la peine de penser à un plan de sauvegarde :) (Modifier: Ah, je vois que vous avez édité votre commentaire pour suggérer à peu près la même chose ... Donc, au moins, vous êtes aussi fou que je suis ou vice versa :)
@Jon - Cheers, tu es un héros :) Dormir serré :) Edit: La folie est relative. My Jour Job est Jeux PS3, les hacks de ce code sont au-delà de l'imagination;)
Comme il n'y a que quelques types numériques et ce nombre ne changera jamais, il peut être préférable d'utiliser des expressions et des déclarations si lentes. Il serait également plus clair, codewise.
@Siride: la réflexion ici ne sera jamais effectuée une fois par type - et compte tenu du nombre de types possibles impliqués (9, de l'actualisation d'octets et de Sbyte), je dirais que le code utilisant comme code> (ou Peu importe) serait considérablement moins clair.
Pour considérer également que s'il va juste faire des sous-types de la possibilité qu'il va avoir, alors il sera plus facile de fournir le numéro max / min à la stratégie. J'aime quand même la méthode de Jon, je n'ai pas besoin d'avoir peur de la réflexion. C'est dommage que le mot clé dynamique ne fonctionne pas avec des membres statiques!
@Sebastian: en lui fournissant un modèle de stratégie a des avantages et des inconvénients. En particulier, il est pratique si vous voulez pouvoir varier le min / max par instance i> du type ... mais d'autre part, si vous voulez pouvoir utiliser maxvalue code> et
Minvalue code> de méthodes statiques logiquement, c'est une douleur si elles doivent être des méthodes d'instance simplement pour obtenir une valeur qui ne sera pas vraiment i> par exemple: (
@Jon: Je suis en train de mettre en œuvre une version comme votre suggestion. Maintenant, je rencontre une seule place où une conversion est faite comme: double val = convert.todouble (valeur); (Où la valeur est un objet) y aurait-il un moyen de convertir générique? T val = convertir. [Insérez une certaine magie ici pour convertir en t] (valeur)
Voir la méthode Convert.ChangetypeType
@IUSEDTOBEAPYGMY: Quel est le type actuel de la valeur?
En ce qui concerne la performance, si vous voulez utiliser une génération de code dynamique pour compiler le code réel pouvant être exécuté au lieu d'utiliser la réflexion.
@Burningice: Je vous garantis que la réflexion utilisée dans ce code sera pas i> un goulot d'étranglement de la performance.
@Everyone: c'est un UserControl. Ce qui signifie que cela ne sera pas mon goulot d'étranglement de la performance; L'utilisateur n'est que si rapide;) Le goulot d'étranglement sera l'énorme quantité de rendu que je ferai sur le GPU, et non le UserControl qui contrôlera un seul paramètre de rendu;) mais vraiment, merci pour toute votre contribution, j'apprécie vraiment vos réactions.
@Sebastian: Merci beaucoup, exactement ce dont j'avais besoin. Excusez-moi pour pas rverm'ing;)
@jon je sais ... c'était plus comme une contribution à laquelle cela pourrait également être fait, afin que nous ayons toutes les possibilités; Réflexion, étui de commutation, en tant que casting et génération de code dynamique :)
L'OP a fait ce commentaire sur une autre réponse:
Je veux utiliser ces contrôles dans mon Xaml. Mon idée était de créer un générique version, puis créer des classes vides comme numericupdownint: Gnumericupdown {} serait-ce la voie à suivre ou y a-t-il un Mieux / Nettoyant Way à votre connaissance P> blockQuote>
Si vous allez aller cette voie, alors passez directement le min et max directement: P>
class abstract GenericNumericUpDown<T> { public GenericNumericUpDown(T min, T max) { ... } } class NumericUpDownInt : GenericNumericUpDown<int> { public NumericUpDownInt() : base(int.MinValue, int.MaxValue) { ... } } class NumericUpDownFloat : GenericNumericUpDown<float> { public NumericUpDownFloat() : base(float.MinValue, float.MaxValue) { ... } } class NumericUpDownDouble : GenericNumericUpDown<double> { public NumericUpDownDouble() : base(double.MinValue, double.MaxValue) { ... } }
Oui bien sur. Je suis choqué comme pourquoi cela ne m'a pas eu. Je pense que c'est l'un de ces cas de pensée trop complexe, alors j'ai raté la solution simple.
Vous devez obtenir le dernier code source pour la boîte à outils WPF étendue. Le contrôle numérique mis à jour vous permet de spécifier quel type de données à utiliser dans l'éditeur. Le code suivant spécifie d'utiliser un int32 comme type de données au lieu du double par défaut. Comme vous pouvez le constater, cela se fait en définissant la propriété valeurype sur le contrôle numericupDown.
Comme cela est également utile dans les scénarios de test:
Vous pouvez utiliser des méthodes d'extension, telles que dans le C # 6 (introduire nom de code>), vous pouvez écrire: P>
var typeMinValue = typeof(T).MinValue<T>();
Juste un Sidenote: trompeur ici peut être que nomof (minvalue) code> références La méthode que vous définissez - et non un éventuel
Minvalue code> Propriété de
Tapez auto code> - Donc, ce n'est pas vraiment meilleur (si du tout!) que d'utiliser
"minvalue" code> explicitement.
Votre plus grande inquiétude sera de savoir comment faire de l'arithmétique avec un type générique ... voir Marc Le travail de gravell avec des arbres d'expression pour cela .