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
'program story' 카테고리의 다른 글
| D3 Force Directed Layout에서 노드 위치 수정 (0) | 2020.11.18 |
|---|---|
| Chrome에서 웹 검사기를 어떻게 검사합니까? (0) | 2020.11.18 |
| Android NDK 코드에 로그인하는 간단한 방법이 있습니까? (0) | 2020.11.17 |
| \ u003C는 무엇을 의미합니까? (0) | 2020.11.17 |
| Hive는 HDFS에서 파일을 어디에 저장합니까? (0) | 2020.11.17 |