2009-12-29 27 views
50

Tôi đang trích xuất một giá trị bool từ một bộ sưu tập (không chung chung, hetrogeneous).Làm thế nào để an toàn cast một System.Object vào một `bool` trong C#?

Nhà điều hành as chỉ có thể được sử dụng với các loại tài liệu tham khảo, vì vậy nó không thể làm sử dụng as thử một an toàn-cast để 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; 

Có một cái gì đó tương tự mà có thể làm như vậy một cách an toàn đưa một đối tượng vào một loại giá trị mà không có khả năng của một InvalidCastException nếu, vì lý do gì, giá trị không phải là một boolean?

Trả lời

87

Có hai lựa chọn ... với hiệu suất hơi ngạc nhiên:

  • kiểm tra dự phòng:

    if (rawValue is bool) 
    { 
        bool x = (bool) rawValue; 
        ... 
    } 
    
  • Sử dụng một loại nullable:

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

Các phần đáng ngạc nhiên là thứ e performance of the second form is much worse than the first.

13

Như thế này:

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

Không giống như các loại tài liệu tham khảo, không có cách nào nhanh để cố gắng đúc đến một loại giá trị mà không cần hai phôi. (Hoặc một khối catch, đó sẽ là tồi tệ hơn)

+1

@SLaks: Xem câu trả lời của tôi và của kalusbyskov về các lựa chọn thay thế để sử dụng hai phôi. Không phải là nó thực sự hữu ích. –

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

Bạn có thể bỏ nó vào một bool? với từ khóa as và kiểm tra HasValue tài sản.

3

Bạn chưa xác định điều bạn muốn xảy ra nếu rawValue không chuyển đổi thành bool. Các lựa chọn phổ biến là trả về false, null hoặc ném một ngoại lệ. Ngoài ra còn có khả năng biểu diễn chuỗi của rawValue được chuyển đổi thành một bool, chẳng hạn như Có/Không, True/False, 1/0, v.v.

Tôi sẽ sử dụng bool.TryParse để thực hiện chuyển đổi. Điều này sẽ thành công nếu rawValue là một bool hoặc ToString() trả về "True".

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

Bạn cũng có thể thử Convert.ToBoolean (rowValue);

+1

Điều này sẽ ném một ngoại lệ nếu loại không phải là một chuyển đổi thành một boolean, và nó cũng sẽ cố gắng chuyển đổi các giá trị không boolean thành một boolean nếu nó có thể, mà không phải là những gì yêu cầu nhà nước nên xảy ra. – Servy

+0

Rất tiếc. Tôi đã không chú ý ở đây. Cảm ơn! – user3934664

Các vấn đề liên quan