2009-12-29 2 views
50

J'extraire une valeur bool d'une collection (non générique, hetrogeneous).Comment est-ce que je peux lancer en toute sécurité un System.Object à un `bool` en C#?

L'opérateur as ne peut être utilisé avec des types de référence, il est donc impossible de ne pas utiliser as pour essayer un coffre-fort-cast à bool:

// 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; 

Y at-il quelque chose de similaire qui peut être fait en toute sécurité cast un objet à un type de valeur sans possibilité d'un InvalidCastException si, pour une raison quelconque, la valeur n'est pas un booléen?

Répondre

87

Il y a deux options ... avec des performances légèrement surprenante:

  • vérification redondante:

    if (rawValue is bool) 
    { 
        bool x = (bool) rawValue; 
        ... 
    } 
    
  • Utilisation d'un type Nullable:

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

Le partie surprenante est que th e performance of the second form is much worse than the first.

13

Comme ceci:

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

Contrairement types de référence, il n'y a pas moyen rapide d'essayer de jeter à un type de valeur sans deux moulages. (Ou un bloc catch, ce qui serait pire)

+1

@SLaks: Voir les réponses de mell et kalusbyskov pour des alternatives à l'utilisation de deux moulages. Pas que ça aide vraiment. –

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

Vous pouvez jeter un bool? avec le mot-clé as et vérifier la propriété HasValue.

3

Vous n'avez pas défini ce que vous voulez faire si rawValue n'est pas convertible en bool. Les choix courants sont de retourner false, null, ou de lancer une exception. Il y a aussi la possibilité de convertir la chaîne de rawValue en bool, comme Yes/No, True/False, 1/0, etc.

J'utiliserais bool.TryParse pour faire la conversion. Cela réussira si rawValue est un bool ou si ToString() renvoie "True".

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

Vous pouvez également essayer Convert.ToBoolean (rowValue);

+1

Cela lancera une exception si le type n'est pas convertible en un booléen, et il essayera aussi de convertir des valeurs non booléennes en un booléen si c'est possible, ce qui n'est pas ce que l'état des exigences devrait arriver. – Servy

+0

Oups. Je ne faisais donc pas attention ici. Merci! – user3934664

Questions connexes