Bonjour, j'utilise une classe ayant 3 propriétés où l'une des propriétés est un tableau. Je veux ajouter une liste de données à la classe.
model m = new model { Name = "aaa", Status = "success", Actions=new string[]{ if(status=="success){ "Stop", "Restart" } } };
lors de l'ajout de valeur à la classe ci-dessus si la propriété status a la valeur «succès» Je dois ajouter les valeurs «pause et actualisation» pour «Actions». sinon je dois ajouter les valeurs «start and refresh». quand j'essaye comme ci-dessous, j'obtiens une erreur de compilation
public class model { public string Name { get; set; } public string Status { get; set; } public string[] Actions { get; set; } }
est-il possible d'ajouter de la valeur basée sur la condition comme ci-dessus?
4 Réponses :
Exemple d'utilisation de l'opérateur ternaire:
var status = "success"; model m = new model { Name = "aaa", Status = status, Actions = status == "success" ? new[] { "Pause", "Refresh" } : new[] { "Stop", "Restart" } };
Vous pouvez essayer ceci:
Actions = status == "success" ? new string[]{"value"} : new string[] {"another value"};
Nous utilisons le ternaire conditionnel pour attribuer la valeur appropriée aux Actions
. Lorsque la condition status == "success"
est vraie, la valeur de la nouvelle chaîne [] {"value"}
affectée à Actions
. Sinon, la valeur de new string [] {"another value"}
affectée à Actions
.
Vous pouvez utiliser l ' opérateur conditionnel ternaire , par exemple:
Actions = status=="success" ? new string[]{ "Stop", "Restart" } : new string[]{ "Pause", "Refresh" }
Théoriquement, oui, techniquement, non.
L'initialiseur est juste un proxy pour créer une nouvelle instance de cette structure, en appelant son constructeur par défaut, puis en définissant chacune de ces valeurs de membre. Donc, en théorie, cela fonctionne bien, mais syntaxiquement, il n'y a aucun moyen d'accéder au modèle à ce stade car il n'a pas été initialisé. Vous devrez le définir seul.
S'il s'agit d'un comportement global, vous pouvez écrire un constructeur pour ne prendre que le nom et l'état, puis remplir les actions, mais avec les initialiseurs, le ctor s'exécute toujours en premier, il n'a donc aucun moyen d'accéder aux données d'initialisation. p >
Modifier, car il en faut apparemment un; Je parle de la raison pour laquelle ce que l'OP essayait de faire ne se compilerait pas. Vous ne pouvez pas interroger d'autres membres qui ont été initialisés en ligne. Oui, vous pouvez contourner ce problème en déclarant à l'avance la variable d'état.
Les autres réponses fournissent des solutions de contournement, j'explique pourquoi cela ne peut pas être fait en ligne dans un initialiseur, ce qu'il essayait de faire. Évidemment, vous pouvez simplement le déclarer seul et le vérifier.
Ils fonctionnent dans un initialiseur avec une variable prédéclarée. Je dis que vous ne pouvez pas le déclarer dans le cadre de l'initialiseur, puis le vérifier dans d'autres instructions d'initialisation. C'est bien en théorie, mais la spécification ne le permet pas.
Euh, oui, les autres réponses suggèrent de le faire avec une variable prédéclarée. Il essayait de le déclarer en ligne, puis de vérifier cette valeur en ligne, même s'il y a une faute de frappe dans la question où il ne l'a pas mise en majuscule, étant donné qu'il ne définit pas le statut sur la même variable.
Vous pouvez faire des choses dans le getter / setter: stackoverflow.com/questions/11159438/...
Vous pouvez envisager d'utiliser un
enum
pourStatus
.string
peut être n'importe quoi, et vous devez gérer des problèmes de casse, etc.