2009-12-29 17 views
50

Ich extrahiere einen bool Wert aus einer (nicht-generischen, heterogenen) Sammlung.Wie kann ich ein System.Object in C# sicher in einen `bool` umwandeln?

Der as Operator kann nur mit Referenztypen verwendet werden, so ist es nicht möglich, den Einsatz zu tun as einen sicheren Guss zu bool versuchen:

// This does not work: "The as operator must be used with a reference type ('bool' is a value type)" 
object rawValue = map.GetValue(key); 
bool value = rawValue as bool; 

Gibt es etwas ähnliches, die so sicher getan werden kann, ein Objekt auf einen Werttyp ohne Möglichkeit einer InvalidCastException umwandeln, wenn der Wert aus irgendeinem Grund kein Boolescher Wert ist?

Antwort

87

Es gibt zwei Möglichkeiten ... mit etwas überraschend, Leistung:

  • Redundante Kontrolle:

    if (rawValue is bool) 
    { 
        bool x = (bool) rawValue; 
        ... 
    } 
    
  • ein Nullable Type Verwendung:

    bool? x = rawValue as bool?; 
    if (x != null) 
    { 
        ... // use x.Value 
    } 
    

Die Überraschender Teil ist, dass th e performance of the second form is much worse than the first.

13

So:

if (rawValue is bool) { 
    bool value = (bool)rawValue; 
    //Do something 
} else { 
    //It's not a bool 
} 

Anders als Referenztypen, gibt es kein schnellen Weg, um zu versuchen, ohne zwei Abgüsse auf einen Wert Art zu werfen. (Oder ein catch-Block, die schlimmer wäre)

+1

@SLaks: Siehe meine und kalusbyskov Antworten für Alternativen zur Verwendung von zwei Güssen. Nicht dass es wirklich hilft. –

7
bool value; 
if(rawValue is bool) 
    value = (bool)rawValue; 
else { 
    // something is not right... 
4

Sie es zu einem bool? mit dem as Stichwort werfen kann und überprüfen Sie die HasValue Eigenschaft.

3

Sie haben nicht definiert, was Sie wollen, wenn rawValue nicht in bool konvertiert werden kann. Gewöhnliche Auswahlmöglichkeiten sind die Rückgabe von false, null oder das Auslösen einer Ausnahme. Es gibt auch die Möglichkeit, dass die Zeichenfolgendarstellung von rawValue in eine bool umwandelbar ist, wie zB Ja/Nein, Wahr/Falsch, 1/0, etc.

Ich würde bool.TryParse verwenden, um die Konvertierung durchzuführen. Dies ist erfolgreich, wenn rawValue ein Bool ist oder wenn ToString() "True" zurückgibt.

bool result; 
if (!bool.TryParse(rawValue.ToString(), out result)) 
{ 
    // you need to decide what to do in this case 
} 
-2

Sie können auch Convert.ToBoolean (rowValue);

+1

Dadurch wird eine Ausnahme ausgelöst, wenn der Typ nicht in einen booleschen Wert konvertiert werden kann. Außerdem wird versucht, nicht boolesche Werte in einen booleschen Wert zu konvertieren, sofern dies möglich ist. – Servy

+0

Hoppla. Ich habe hier also nicht aufgepasst. Vielen Dank! – user3934664

Verwandte Themen