est-il possible d'utiliser le commutateur lors de la comparaison de classes dans une méthode générique?
Exemple: L'idée n'est pas d'utiliser le nom mais l'objet de la classe.
Au moment, j'utilise: p> pour la simplicité, il serait bon d'utiliser le commutateur. P> P>
3 Réponses :
Dans des cas comme celui-ci, j'utilise des dictionnaires, jumelés avec des valeurs de Lambdas comme adapté au problème spécifique à la main.
private static readonly Formatters = new Dictionary<Type, Func<object, string>>() { { typeof(Class1), o => ((Class1)o).format() }, { typeof(Class2), o => FormatClass.FormatClass2((Class2)o) }, ... }; T instance; string formatted = Formatters[typeof(T)](instance);
Ces options ne sont pas plus simples qu'un si / else si code> solution.
Cela dépend de ce que vous pense i> est simple. Je trouve qu'il est beaucoup plus compact (généralement 1 rangée / classe au lieu de 4) et assez facile à vérifier. 10 classes sont facilement vérifiés dans un dictionnaire, pas si facilement vérifié dans le code. Et le dernier mais surtout, avoir un dictionnaire vous permet de rendre le tout configurable. Franchement, je me soucie davantage de la facilité d'entretien et de lisibilité, et moins sur la simplicité. Ymmv,
@Ptuga oui. La solution que j'ai fournie vous permet de le faire. Vous devez lancer l'objet sur le type spécifique. Mais vous avez besoin de ça quand même. Une fois que vous vous êtes lancé sur le type spécifique, vous pouvez accéder aux propriétés de cette classe spécifique. Si vous ne voulez pas lancer, vous ne voulez pas d'interrupteur: vous voulez des implémentations dactylographiées d'une classe abstraite générique.
L'idée serait d'effectuer mon code comme dans un interrupteur. Le dosage () signifie quelque chose en dehors de ma méthode et ne se distingue pas entre les différents T. parce que je dois travailler avec les accessoires de la classe E.G. Pour CLASS1, String S = ProP1 + "\ T" + ProP2 sur la classe2 pourrait être une chaîne différente S = PROP2 + "\ T" + PROP3 (il peut même être une liste
@Ptuga alors je vous suggère de l'essayer jusqu'à ce que vous le comprenez. Si quelque chose de spécifique n'est pas compris, faites le moi savoir.
Si vous utilisez C # 7, vous pouvez utiliser la correspondance des motifs.
Par exemple, P>
public class A{} public class B{}
Développement sur Anu Viswan 'S Réponse , puisque c # 7.1, ceci est valide:
Le commutateur à motifs C # V7.1 ne vous aidera pas:
une expression de type 't' ne peut pas être traité par un modèle de type 'classe1' code>. Je pense que votre
si / sinon si le modèle code> est aussi bon que vous allez obtenir
Créez une chaîne qui dépend des propriétés de la classe, qui peuvent encore varier de la classe1 à la classe2. Code> Que ressemblent ces cordes? Vous devriez envisager d'ajouter cette logique aux classes (
classe1 code> etc.) - plutôt que sur cette méthode. Ensuite, cette méthode peut appeler la méthode que vous ajoutez à
class1 code> /
class2 code> etc. (même mieux si vous avez une interface qui définit la méthode, que chaque classe implémente).
@Ptuga vous confondez la version C # avec la version .NET?
Le dupliqué original fonctionne bien avec .NET 4.5 @Ptuga - Stackoverflow.com/a/42488315/34092 - correspondance des motifs est juste sucre syntaxique. En quoi utilisez-vous?
@Jonathon Chase: Framework cible .NET Framework 4.5
@ptuga Vous devriez bien vouloir utiliser C # 7 puis, en supposant que Visual Studio 2017+. La version linguistique n'a pas d'impact sur votre cible de cadre.
Dupliqué possible de Stackoverflow.com/a/43080709/34092 .
@Jonathon Chase: Dans mon cas, la version linguistique doit être C # 5 à cause du compilateur. Tous les exemples utilisent C # 7 que je ne peux pas utiliser. Plus de pensées?