program story

System.Object를 C #에서`bool`로 안전하게 캐스팅하려면 어떻게해야합니까?

inputbox 2020. 11. 17. 08:05
반응형

System.Object를 C #에서`bool`로 안전하게 캐스팅하려면 어떻게해야합니까?


나는 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어떤 이유로 든 값이 부울이 아닌 경우의 가능성없이 객체를 값 유형으로 안전하게 캐스트하기 위해 수행 할 수있는 유사한 작업이 있습니까?


약간 놀라운 성능을 가진 두 가지 옵션이 있습니다.

  • 중복 검사 :

    if (rawValue is bool)
    {
        bool x = (bool) rawValue;
        ...
    }
    
  • nullable 유형 사용 :

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

놀라운 부분은 두 번째 형식성능이 첫 번째 형식보다 훨씬 나쁘다는 것 입니다.

C # 7에서는이를 위해 패턴 일치를 사용할 수 있습니다.

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

명령문 value이후에도 여전히 범위 내 (확실히 할당되지는 않음)로 끝납니다 if.


이렇게 :

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

참조 유형과 달리 두 번의 캐스트없이 값 유형으로 캐스트하는 빠른 방법은 없습니다. (또는 캐치 블록, 더 나쁠 것입니다)


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

당신은에 전송할 수 있습니다 bool?as키워드와 확인 HasValue속성을.


rawValue를 bool로 변환 할 수없는 경우 발생하려는 작업을 정의하지 않았습니다. 일반적인 선택은 false, null을 반환하거나 예외를 throw하는 것입니다. Yes / No, True / False, 1/0 등과 같이 rawValue의 문자열 표현을 bool로 변환 할 수있는 가능성도 있습니다.

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
}

Providing you don't actually need to keep a reference to the rawValue, here's a one-liner using the GetValueOrDefault() method of the Nullable<T> structure:

bool value = (map.GetValue(key) as bool?).GetValueOrDefault();

You can also specify a default value using the method overload GetValueOrDefault(T).


I used this check before doing something with object

if(myCrazyObject.GetType().Equals(typeof(bool)))
{
   //do smt with it
}

If the goal is to have true only if the raw object is boolean 'true' then one-liner (rawValue as bool?)?? false will do:

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`

You can also try Convert.ToBoolean(rowValue);

참고URL : https://stackoverflow.com/questions/1974922/how-do-i-safely-cast-a-system-object-to-a-bool-in-c

반응형