2010-09-08 10 views
21

Ich habe eine Eigenschaft, die ich als int? in meiner Settings.settings-Datei eingeben möchte. Als ich int? verwende ich einen Laufzeitfehler erhalten:Zulässiger Int-Typ in Settings.settings erlaubt?

System.NullReferenceException: Objektverweis nicht auf eine Instanz eines Objekts festgelegt ..

ich einen String-Typ als Behelfslösung, wo eine Prüfung für null Arbeiten verwenden können, aber ich muss die Zeichenfolge analysieren und Fehler behandeln, wenn das Parsen nicht funktioniert.

Wenn ich den Wert auf null setzen kann, kann ich die in der Einstellungsdatei dokumentierte Eigenschaft beibehalten, obwohl es offensichtlich ist, dass kein Wert festgelegt wurde. Wenn nicht gesetzt verwende ich einen programmierten Standardwert:

int? configuredNumberOfLimits = Settings.Default.RequiredNumberOfLimits; 
if (configuredNumberOfLimits == null ) 
{ 
    requiredNumberOfLimits = DEFAULT_REQUIRED_NUMBER_LIMITS; 
} 
+0

Verwenden var statt? – Gage

+1

@ Gage: Ich denke, das ist der Punkt fehlt. Er möchte die Einstellung * definiert * als 'int?' Definieren. –

Antwort

2

Ich denke, Ihre beste Wette eine altmodische bool/int Combo sein wird. Es ist nicht die schönste Lösung, aber es ist nicht wirklich , dass von einem int? unterscheidet.

int configuredNumberOfLimits; 
if (Settings.Default.HasRequiredNumberOfLimits) 
{ 
    configuredNumberOfLimits = Settings.Default.RequiredNumberOfLimits; 
} 
else 
{ 
    configuredNumberOfLimits = DEFAULT_REQUIRED_NUMBER_LIMITS; 
} 
+0

Danke. Seit int? ist kein unterstützter Typ in Settings.settings Meine Wahl scheint zwischen dem zu liegen, was Sie vorgeschlagen haben und was @Kevin vorschlägt. – Don

+0

@Martin: Ja, so ziemlich;) –

3

Was:

int configuredNumberOfLimits 

if(!int.TryParse(Settings.Default.RequiredNumberOfLimits, 
    out configuredNumberOfLimits)) 
{ 
    configuredNumberOfLimits = DEFAULT_REQUIRED_NUMBER_LIMITS; 
} 

diese Weise können Sie den Wert überprüfen, und wenn es nicht gesetzt Sie den Standardwert. Keine Sorge wegen Strings oder Parsing oder nicht behandelter Ausnahmen.

+0

Das ist die Workaround, die ich erwähnt habe. Ich möchte die Analyse möglichst vermeiden. – Don

+0

Ich habe das nicht versucht, aber hast du int versucht? Wert = Einstellungen ... as (int) – kemiller2002

52

Es gibt einen Weg Nullable Type (das heißt int?) für eine Einstellung zu verwenden - es erfordert ein wenig manuellen Bearbeitung der Einstellungsdatei, aber danach funktioniert in VS-Umgebung in Ordnung und im Code. Und benötigt keine zusätzlichen Funktionen oder Wrapper.

Um dies zu tun, um eine Einstellung mit dem gewünschten Namen (z.B. RequiredNumberOfLimit) erstellt und von jeder Art machen (z.B. Standard int Einfachheit halber). Speichern Sie die Änderungen.

Nun zu Ihrem Projektordner geht und öffnen Sie die „Eigenschaften \ Settings.settings“ Datei mit Text-Editor (Notepad zum Beispiel) Sie können auch mit einem Rechtsklick in Projektmappen-Explorer es in VS öffnen auf "< Ihr Projekt > -> Eigenschaften -> Einstellungen.Einstellungen ", wählen Sie" Öffnen mit ... "und wählen Sie dann entweder" XML-Editor "oder" Quelltext (Text) -Editor ". In den geöffneten XML-Einstellungen finden Sie Ihre Einstellung (es wird wie folgt aussehen):

<Setting Name="RequiredNumberOfLimit" Type="System.Int32" Scope="User"> 
    <Value Profile="(Default)">0</Value> 
</Setting> 

Ändern Sie den „Typ“ param System.Int32-System.Nullable<System.Int32>. Und löschen Sie auch den Standardwert (so könnte dort standardmäßig Null verwendet werden). nun dieser Abschnitt sollte wie folgt aussehen (beachten Sie, dass &lt; und &gt; verwendet < und > Symbole innerhalb des Typs Zeichenfolge darzustellen - dies für die korrekte Parsen von XML von VS erfolgt):

<Setting Name="RequiredNumberOfLimit" Type="System.Nullable&lt;System.Int32&gt;" Scope="User"> 
    <Value Profile="(Default)" /> 
</Setting> 

Jetzt Änderungen speichern und Projekteinstellungen erneut öffnen - voilà! - Wir haben die Einstellung RequiredNumberOfLimit mit Typ System.Nullable<System.Int32>, die ordnungsgemäß von VS Settings Designer analysiert wird, sowie es als eine normale int? Variable im Code verwendet werden konnte.

Wenn Sie möchten, dass diese Einstellung null zurückgeben kann, sollten Sie das Feld für den Standardwert deaktivieren. Andernfalls wird der Standardwert von dieser Einstellung zurückgegeben, wenn er zuvor null zugewiesen wurde (aber so funktionieren die Standardwerte, nicht wahr?: P).

+0

Cool !! Klappt wunderbar! –

+4

Der Ansatz funktionierte, um die Einstellung im Designer "Einstellungen" anzuzeigen und den Standardwert im Code festzulegen. Meine Einstellung ist jedoch aus der App.config-Datei verschwunden, als ich diese Änderung vorgenommen habe. Das mag in einem bestimmten Kontext wichtig sein oder auch nicht, aber ich fand es bemerkenswert. – Brian

+1

Um hinzuzufügen, was @Brian sagte: Ja, die Bearbeitung mit dem Einstellungen-Designer löscht die Einstellungen aus app.config, aber wenn Sie sie zurückstellen, werden sie von dort wieder gelesen. Also, entweder benutze den Designer nicht, oder erinnere dich daran, die Einstellungen nach der Verwendung zurückzusetzen ... ein bisschen Schmerz, aber in meinem Fall denke ich, dass es das wert ist. – Paul

1

Sie können manuelle Settyps in Settings.Designer.cs

Zum Beispiel:

public decimal? Test{ 
     get { 
      return ((decimal?)(this["Test"])); 
     } 
     set { 
      this["Test"] = value; 
     } 
    } 
+0

Das Problem dabei ist, dass Sie jedes Mal, wenn Sie die Registerkarte "Einstellungen" ändern, in die Datei "designer.cs" zurückkehren und den Typ erneut ändern müssen. –

+0

ja natürlich. in meinem Fall ändere ich es sehr selten, und es ist kein Problem für mich –

Verwandte Themen