我如何安全地将一个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);