我如何安全地将一个System.Object转换为C#中的`bool`?

我从一个(非generics,hetrogeneous)集合中提取一个bool值。

as运算符只能与引用types一起使用,所以不可能使用这个as来尝试一个安全投入的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; 

有没有类似的东西可以做到这样安全地将一个对象转换为一个值types而不可能发生InvalidCastException如果由于某种原因该值不是一个布尔值?

有两个select…有点令人惊讶的performance:

  • 冗余检查:

     if (rawValue is bool) { bool x = (bool) rawValue; ... } 
  • 使用可空types:

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

令人惊讶的是, 第二种forms的performance比第一种performance要差得多 。

喜欢这个:

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

与引用types不同,没有两种强制types转换为值types的快速方法。 (或一个catch块,这会更糟糕)

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

如果rawValue不能转换为bool,你还没有定义你想要发生什么。 常见的select是返回false,null或抛出exception。 还有可能将rawValue的string表示forms转换为布尔forms,如Yes / No,True / False,1/0等。

我会使用bool.TryParse做转换。 这将成功,如果rawValue是一个布尔或其ToString()返回“True”。

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

你可以把它投到bool?as关键字并检查HasValue属性。

你也可以尝试Convert.ToBoolean(rowValue);