2009-12-29 106 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

相關問題