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

时间:2009-12-29 14:36:23

标签: c# .net casting

我从(非通用的,异构的)集合中提取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

10 个答案:

答案 0 :(得分:109)

有两种选择......性能略有惊人:

  • 冗余检查:

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

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

令人惊讶的是performance of the second form is much worse than the first

在C#7中,您可以使用模式匹配:

if (rawValue is bool value)
{
    // Use value here
}

请注意,在value语句后,您仍然会在范围内(但未明确分配)结束if

答案 1 :(得分:16)

像这样:

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

与引用类型不同,没有快速的方法可以在没有两个强制转换的情况下尝试强制转换为值类型。 (或者一个陷阱,这会更糟)

答案 2 :(得分:7)

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

答案 3 :(得分:4)

您可以使用bool?关键字将其投放到as并检查HasValue属性。

答案 4 :(得分:4)

如果rawValue无法转换为bool,您还没有定义要发生的事情。常见的选择是返回false,null或抛出异常。还有可能将rawValue的字符串表示转换为bool,例如Yes / No,True / False,1/0等。

我会使用bool.TryParse来进行转换。如果rawValue是bool或其字符串值为“True”或“False”,则会成功。

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

答案 5 :(得分:0)

假设您实际上不需要保留对supposedlyGlobalVariable := "blah" ARoutine() { global supposedlyGlobalVariable localVariable := "asdf" MsgBox, The global variable value is %supposedlyGlobalVariable%. The local variable value is %localVariable%. } ^!X:: ;This assigns the hotkey CTRL + ALT + X to run the routine ARoutine() return 的引用,这是使用GetValueOrDefault()结构的Nullable<T>方法的单行代码:

rawValue

您还可以使用方法重载GetValueOrDefault(T)指定默认值。

答案 6 :(得分:0)

在使用 object

做某事之前,我使用了此检查
if(myCrazyObject.GetType().Equals(typeof(bool)))
{
   //do smt with it
}

答案 7 :(得分:0)

如果目标是仅当原始对象为布尔值“ true ”时具有 true ,则单行(rawValue as bool?)?? false将做到:

object rawValue=null
(rawValue as bool?)?? false
false
rawValue="some string"
(rawValue as bool?)?? false
false
rawValue=true
(rawValue as bool?)?? false
true
rawValue="true"
(rawValue as bool?)?? false
false
rawValue=false
(rawValue as bool?)?? false
false
rawValue=""
(rawValue as bool?)?? false
false
rawValue=1
(rawValue as bool?)?? false
false
rawValue=new Dictionary<string,string>()
(rawValue as bool?)?? false
false`

答案 8 :(得分:-1)

如果合适的话,您也可以简单地做:

if(rawValue is true)
{
    //do stuff
}

答案 9 :(得分:-3)

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