Configuration personnalisée, ConfigurationElements, et ConfigurationProperties
J'ai été à récurer le net pour les 3 derniers jours, et ne pouvez pas trouver aucune référence à cette question. J'ai créé une configuration personnalisée de la classe pour être utilisé avec mon application.config. Tout fonctionne très bien. Le problème vient quand une propriété de configuration (d'un élément de configuration) n'est pas nécessaire et n'est pas défini dans l'application.config. Il semble que par défaut les valeurs sont renvoyées pour la configuration de la propriété. Quelqu'un sait-il comment faire pour déterminer si la propriété n'est pas définie dans l'application.config? (J'ai essayé de poster mon application.config, mais impossible de trouver comment faire...quelqu'un sait comment?)
//Main
namespace TestStub
{
class Program
{
static void Main(string[] args)
{
CustomSettingsHandler config = (CustomSettingsHandler)ConfigurationManager.GetSection("CustomSettingsManager");
Console.WriteLine("Setting1 {0}", config.Setting1.CustomSettingItem);
Console.WriteLine("Setting2 {0}", config.Setting2.CustomSettingItem);
}
}
}
//Custom Configuration Class
namespace CustomConfiguration
{
public class CustomSettingsHandler : ConfigurationSection
{
[ConfigurationProperty("setting1", IsRequired = false)]
public CustomSettingElement Setting1 { get { return (CustomSettingElement)this["setting1"]; } }
[ConfigurationProperty("setting2", IsRequired = false)]
public CustomSettingElement Setting2 { get { return (CustomSettingElement)this["setting2"]; } }
}
public class CustomSettingElement : ConfigurationElement
{
[ConfigurationProperty("customsettingitem", IsRequired = false)]
public int CustomSettingItem { get { return (int)this["customsettingitem"]; } }
}
}
OriginalL'auteur user62064 | 2009-02-20
Vous devez vous connecter pour publier un commentaire.
J'ai trouvé la meilleure façon est de remplacer
ConfigurationSection.PostDeserialize()
et vérifier laIsPresent
de la propriété de chaque membre de l'article qui en découleConfigurationElement
.Chaque
ConfigurationElement
qui n'a pas été lu à partir du fichier de configuration seranull
par la suite.PostDeserialize
événement. LeElementInformation
est toujours disponible:Console.WriteLine("Setting1 {0}", config.Setting1.CustomSettingItem.ElementInformation.IsPresent ? "Y" : "N");
OriginalL'auteur Good Night Nerd Pride
2 choses que je peux penser à du haut de ma tête serait d'utiliser une Valeur par défaut, comme suit:
En supposant qu'il existe une valeur qui n'est pas valide. Dans ce cas, CustomSettingItem == -1 signifie qu'il n'était pas ensemble, et >= 0 est une valeur définie dans la configuration. Bien sûr que suppose -1 n'était pas une entrée valide dans la première place.
Deuxième idée est d'utiliser un nullable int à la place:
Maintenant, si rien n'est réglé dans la configuration, il devrait être par défaut à null au lieu de 0.
OriginalL'auteur CodingWithSpike
Essayez ce qui suit:
La
ValueOrigin
propriété vous indique d'où vient la valeur de viennent de.IsPresent
n'était pas renvoyer la valeur attendue pour une raison quelconque (il retourné false pour tout).ValueOrigin
a fonctionné pour moi.OriginalL'auteur vocaris
Jusqu'à présent, je n'ai pas été en mesure de dire qu'une propriété soit null si il n'est pas défini dans le fichier de configuration. Il semble que, dans son infinie sagesse, Microsoft a décidé de vous vraiment moyenne de la Chaîne.Vide ou de nouveaux ConfigurationElement() lorsque vous tapez la valeur null.
La façon dont je suis en train de le résoudre, c'est comme cela:
C'est un hack et à tort la marque de la propriété en tant que de besoin. Si vous utilisez un outil pour éditer votre fichier de configuration, il ne sera pas comme ça.
OriginalL'auteur Patrick Huizinga
Vous pouvez également vérifier en utilisant les éléments suivants:
il vous donnera false si il n'a pas été trouvé dans votre fichier de configuration.
OriginalL'auteur Jose Ch.