2011-12-18 5 views
18

이 같은 것입니다 :C# Reflection : Nullable 유형을 얻는 방법 <int>? 내가 원하는 무엇

switch(myObject.GetType().GetProperty("id")) 
{ 
    case ??: 
     // when Nullable<Int32>, do this 
    case ??: 
     // when string, do this 
    case ??: 
     // when Nullable<bool>, do this 

object.GetType에서 어떤 경로() 나는 경우 문을 사용하여 비교할 수있는 데이터 형식의 문자열 이름을 가질 것인가? Reflection을 사용하여 myObject의 값을 설정하는 많은 Convert.ToInt32 (문자열) 중 하나를 가질 수 있도록 형식을 알아야합니다.

+1

이것은 거의 틀린 일입니다. 거대한 switch 문을 사용하는 대신 다형성을 활용할 수없는 이유는 무엇입니까? –

+0

다른 매개 변수 유형으로 여러 함수를 만드는 것이 좋습니다. 이 경우에는 한 객체에서 다른 유형의 속성 집합을 항상 문자열 유형으로 복사하는 중입니다. 그래서, 값을 변환해야합니다. 저도 Reflection에 대한 경험이 거의 없습니다. –

+0

@CodyGray 그는 자신의 ORM 작성과 같은 반성과 관련하여 뭔가를하고있을 수도 있습니다. 또는이 모든 DAO에 대한 사용자 지정 serializer를 작성하면 결코 알 수 없습니다. – nawfal

답변

8

업데이트 : C# 7이 Type에 대한 전환을 지원하는 것처럼 보입니다.이 질문의 묻는 사람이하려고했던 것처럼. 구문 지뢰에주의하십시오.

당신은 그것을 비교하는 문자열 이름이 필요하지 않습니다

if (myObject.GetType().GetProperty("id").PropertyType == typeof(Nullable<Int32>)) 
    // when Nullable<Int32>, do this 
else if (myObject.GetType().GetProperty("id").PropertyType == typeof(string)) 
    // when string, do this 
else if (myObject.GetType().GetProperty("id").PropertyType == typeof(Nullable<bool>)) 
    // when Nullable<bool>, do this 
+1

.GetType()과 typeof (Nullable )를 비교 하시겠습니까? 아니면 GetType() 아래에있는 속성입니까? int를 가정할까요? Nullable 은 동일한 유형 인 a.GetType()! = typeof (Nullable )입니다. –

+0

'switch' 문보다는'if' 문으로 처리해야 할 것입니다. 하지만, 당신처럼, 나는 전에 이것을 한 적이 없습니다. 그것은 나에게 반 패턴처럼 보인다. –

+0

VS 스튜디오에서 위의 코드 스위치 (myObject.GetType())를 통해 "Integral Type 값"이라는 IDE 오류를 표시하고 typeof (XXX)의 case 오류가 "Constant Value is expected"라는 IDE 오류를 표시합니다. – heads5150

0

이 @Cody 회색 말했듯이 문은 아마 나는 다음을 사용하고있는 가장 좋은 방법

var t = myObject.GetType(); 

if (t == typeof(Nullable<int>)) 
{ } 
else if (t == typeof(string)) 
{} 
else if (t==typeof(Nullable<bool>)) 
{} 
+2

,'int? a = 3'이고 'typeof (a)'는 "System.Int32"입니다. –

+1

@ Dr.Zim : 여기 설명 참조 : http://stackoverflow.com/questions/785358/nullable-type-is-not-a-nullable -type –

+1

@ Dr.Zim'typeof (a)'는 컴파일하지 않습니다. 그것은'int'를 반환하는'a.GetType()'입니다. – CodesInChaos

44

될 경우 형식이 nullable인지 확인하고 실제 형식을 가져올 지 확인하는 코드 유형 :

if (type.IsGenericType && type.GetGenericTypeDefinition() == typeof(Nullable<>)) 
{ 
    return Nullable.GetUnderlyingType(type); 
} 

형식이 예 Nullable이 코드는 int 부분 (기본 형식)을 반환합니다. 개체를 특정 형식으로 변환해야한다면 System.Convert.ChangeType 메서드를 사용할 수 있습니다.

+0

+1 그리고이 메소드는 내부에서 같은 체크를 수행하고 주어진 타입이'typeof가 아닌 경우 null을 리턴합니다 Nullable <>)'이므로 if 문 대신 null 확인을 수행하면됩니다. – Connell

16

질문은 매우 혼란 스럽습니다. "myObject"는 nullable int 일 수있는 객체입니까? 또는 속성 "null"이 가능한 유형의 ID입니다.

전자의 경우 질문에 답할 수 없습니다. 이는 허위를 전제로하기 때문입니다. boxed nullable int와 같은 것은 없습니다. 나는 if (myobject.GetType() == typeof(int?))을 제안하는 모든 대답이 부정확하다는 것을주의한다. 그 조건은 결코 사실이 아닐 것이다.

nullable int를 object로 변환 할 때 nullable int가 값을 가지지 않으면 null 참조가되거나 박스형 int가됩니다. 오브젝트 결코에 널 (NULL) 입력 가능 int가 들어 있기 때문에 오브젝트가 널 (NULL) 입력 가능 int를 포함하는지 판별 할 수있는 f}이 없습니다.

속성 유형typeof(int?)을 비교하십시오. 스위치는 사용할 수 없습니다. 스위치 케이스에는 상수 만 사용할 수 있으며 유형은 상수가 아닙니다.

모두 이것은 나쁜 코드 냄새라고 말했습니다. 처음에 반성을 사용하는 이유는 무엇입니까?

+0

업데이트 : C# 7에서 switch 문에 더 이상 상수식이 필요하지 않습니다. –

+0

그리고 유형을 전환 할 수있는 메커니즘을 제공하십시오. 이 기능은 2001 년에 처음 제안 되었습니까? 나는 생각한다. 16 년, 나쁘지 않습니다. –

2

.net에서 값 유형의 인스턴스는 연관된 유형 정보가없는 비트의 모음입니다. 그러나 Nullable<T>이 아닌 모든 값 유형의 경우 시스템은 System.ValueType에서 파생되는 해당 클래스 유형도 자동으로 생성합니다. 값 유형에서 자동 생성 클래스 유형으로의 확장 변환 및 자동 생성 클래스 유형에서 값 유형으로의 변환이 축소됩니다. Nullable<T>의 경우에는 값 유형과의 변환이있는 해당 자동 생성 클래스 유형이 없습니다. 대신 확대 변환은 두 방향 모두에서 Nullable<T>T과 연결된 클래스 유형 사이에 존재합니다.

내가 알 수있는 한 이상한 동작은 null과 빈 Nullable<T> 사이의 값을 비교하여 true를 반환하도록 구현되었습니다.