2009-11-04 10 views
3

J'ai une section de configuration personnalisée dans mon web.config.Analyse de booléen à partir de la section de configuration de web.config

Un de mes cours est saisissant de ceci:

<myConfigSection LabelVisible="" TitleVisible="true"/> 

J'ai des choses de travail pour analyser si j'ai vrai ou faux, si l'attribut est vide, je reçois des erreurs. Lorsque la section config essaye de mapper la classe à la section de configuration, j'obtiens une erreur de "pas une valeur valide pour bool" sur la partie 'LabelVisible'. Comment est-ce que je peux analyser "" comme faux dans ma classe de myConfigSection?

J'ai essayé:

[ConfigurationProperty("labelsVisible", DefaultValue = true, IsRequired = false)] 
    public bool? LabelsVisible 
    { 
     get 
     { 

      return (bool?)this["labelsVisible"]; 

     } 

Mais quand j'essaie d'utiliser ce qui est retourné comme ceci:

graph.Label.Visible = myConfigSection.LabelsVisible; 

Je reçois une erreur de:

'Cannot implicitly convert type 'bool?' to 'bool'. An explicit conversion exists (are you missing a cast?) 

Répondre

0
if (myConfigSection.LabelsVisible.HasValue) 
{ 
    graph.Label.Visible = myConfigSection.LabelsVisible.Value; 
} 
+0

Et si 'myConfigSection.LabelsVisible.HasValue' est' false'? – jason

+0

Puis 'graph.Label.Visible' ne changera pas sa valeur. L'OP n'a pas spécifié le comportement souhaité dans le cas où 'LabelVisible =" "' dans son fichier de configuration. –

3

Ceci est un peu dangereux, mais techniquement fonctionne: (vous aurez obtenir un InvalidOperationException si la valeur de la annulable est en effet nul):

graph.Label.Visible = (bool)myConfigSection.LabelsVisible; 

Vous devez vérifier le annulable pour voir si elle a été définie:

bool defaultValue = true; 
graph.Label.Visible = myConfigSection.LabelsVisible ?? defaultValue; 
2

essayer:

graph.Label.Visible = myConfigSection.LabelsVisible.HasValue ? myConfigSection.LabelsVisible.Value : false; 
+0

L'autre version est: graph.Label.Visible = myConfigSection.LabelsVisible.Value ?? faux; – jaloplo

+0

@jaloplo: Non. 'MyConfigSection.LabelsVisible.Value' est de type' bool' mais l'opérateur '??' est réservé aux opérandes de type main gauche de référence. – jason

+0

Jason, je pense que vous avez donné un vote négatif à ma réponse au lieu du commentaire de jaloplo ... – Nestor

8

Votre le problème est que graph.Label.Visible est de type bool mais myConfigSection.LabelsVisible est de type bool?. Il n'y a pas de conversion implicite de bool? en bool parce que ceci est une réduction de la conversion. Il y a plusieurs façons de résoudre ce:

1: Monter myConfigSection.LabelsVisible à un bool:

graph.Label.Visible = (bool)myConfigSection.LabelsVisible; 

2: extraire la valeur bool sous-jacente de myConfigSection.LabelsVisible:

graph.Label.Visible = myConfigSection.LabelsVisible.Value; 

3: Ajouter une logique pour capturer lorsque myConfigSection.LabelsVisible représente la valeur null:

graph.Label.Visible = myConfigSection.LabelsVisible.HasValue ? 
          myConfigSection.LabelsVisible.Value : true; 

4: Interalize cette logique à myConfigSection.LabelsVisible:

[ConfigurationProperty("labelsVisible", DefaultValue = true, IsRequired = false)] 
public bool LabelsVisible { 
    get { 
     bool? b= (bool?)this["labelsVisible"]; 
     return b.HasValue ? b.Value : true; 
    } 
} 

Il est l'une des deux dernières approches est préférable d'éviter certaines exceptions qui se produiraient si vous utilisez les autres solutions quand myConfigSection.LabelsVisible représente la valeur null. Et la meilleure solution consiste à internaliser cette logique dans le getter propriété myConfigSection.LabelsVisible.

+0

Merci pour l'explication. Ceci est extrêmement utile. Qu'est-ce que le '?' à la fin de 'bool?' appelé? NullableType? – Bloopy

+0

La syntaxe 'T?' Où 'T' est un type de valeur est une courte façon de dire' Nullable '. – jason