2009-12-29 105 views
50

我正在从一个(非泛型,hetrogeneous)集合中提取一个bool值。如何安全地将System.Object转换为C#中的`bool`?

as运营商可能只引用类型来使用,所以这是不可能做到的使用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; 

是否有类似的东西,可以使安全进行如果出于某种原因,如果该值不是布尔值,则将对象转换为值类型而不可能存在InvalidCastException

回答

87

有两个选项...略有表现却令人大跌眼镜:

  • 冗余校验:

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

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

的令人惊讶的部分是那个e performance of the second form is much worse than the first

13

像这样:

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

与引用类型不同,有尝试转换为数值型无需两台强制转换没有快速的方法。 (或catch块,这将是更糟糕)

+1

@SLaks:请参阅我的和kalusbyskov的答案,以替代使用两个演员。并不是说它确实有帮助。 – 2009-12-29 14:48:21

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

您可以用as关键字将它转换为一个bool?并检查HasValue属性。

3

如果rawValue不能转换为bool,你还没有定义你想要发生什么。常见的选择是返回false,null或抛出异常。还有可能将rawValue的字符串表示形式转换为bool,如Yes/No,True/False,1/0等。

我会使用bool.TryParse进行转换。如果rawValue是一个bool或者它的ToString()返回“True”,这将会成功。

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

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

+1

如果类型不是可转换为布尔值,则会引发异常,并且如果可以,它也会尝试将非布尔值转换为布尔值,这不是需求状态应该发生的情况。 – Servy 2014-08-12 18:16:25

+0

糟糕。我在这里没有注意。谢谢! – user3934664 2014-08-15 16:41:03

相关问题