2008-08-31 5 views
10

개체의 속성을 기반으로 데이터 집합을 만들려고합니다. 예를 들어, 나는 속성 반사를 사용하여 ID, 뒤따라야, 성, 생년월일 등을 포함 가진 사람 클래스의 인스턴스를 가지고, 나는 개체 속성을 기반으로 새 데이터 세트에 열을 추가 해요 :VB.NET nullable 유형에서 기본 system.type 가져 오기

For Each pi As PropertyInfo In person.GetType().GetProperties() 
    Dim column As New DataColumn(pi.Name, pi.PropertyType) 
    table.Columns.Add(column) 
Next 

내 문제 이러한 속성 중 일부는 데이터 집합에서 지원하지 않는 nullable 형식입니다. nullable 형식에서 기본 시스템 형식을 추출 할 수있는 방법이 있습니까?

감사합니다.

답변

1

나는이 속성이 nullable인지 아닌지를 인식하고 있다고 생각합니다.

if (type.IsGenericType && type.GetGenericTypeDefinition() == typeof(Nullable<>)) 

을 ...하지만 난 마지막 조항에 해당이 VB.NET에서 무엇 확실하지 않다 : C#에서이 코드를 사용하여이 작업을 수행.

+0

if (type.IsGenericType AndAlso type .GetGenericTypeDefinition은 GetType (Nullable)입니다. –

+0

실제로 VB 로의 올바른 번역이 아닙니다. 기괴하게 충분합니다. 내 대답을 확인하십시오. –

+0

예, 'Nullable'과 'Nullable <>'은 두 가지 유형입니다. –

0

@Mendelt Siebenga : 변수가 null로 설정되지 않은 경우 value 속성에서만 GetType을 호출 할 수 있습니다. 그렇지 않으면 예외가 발생합니다.

"GetValueOrDefault"속성을 사용하여 GetType을 호출하면 null이 아닐 것이므로 보장 할 수 있습니다. 예 :

Dim i As Nullable(Of Integer) = Nothing 
Dim t As Type = i.GetValueOrDefault().GetType() 
2

해당 유형에 GetGenericParameters() 메서드를 사용할 수도 있습니다. myNullableObject.GetType().GetGenericParameters()[0]은 nullable 타입을 제공해야합니다 (따라서 Guid, Int32 등)

15

VB에서 대답은 다음과 같습니다. 이는 과도한 목적 일 수 있지만 일부 다른 사람들에게도 유용 할 수 있습니다.

Private Function IsNullableType(ByVal myType As Type) As Boolean 
    Return (myType.IsGenericType) AndAlso (myType.GetGenericTypeDefinition() Is GetType(Nullable(Of))) 
End Function 

참고 GetType을에서 특이한 구문 : 우선

, 여기 당신이 nullable 형식을 처리하고 있는지 확인하는 코드입니다. 필요합니다. 제안자 중 한 명이 GetType (Nullable)을 사용한다고해서 나에게 도움이되지 못했습니다.

그래서, 무장, 당신은 ORM 도구에서, 나는 또는 null 허용하지 않을 수 있습니다 제네릭 형식에 값을 얻기 위해 노력하고, 여기에 ...이 같은 작업을 수행 할 수 있습니다

If (Not value Is Nothing) AndAlso IsNullableType(GetType(T)) Then 
    Dim UnderlyingType As Type = Nullable.GetUnderlyingType(GetType(T)) 
    Me.InnerValue = Convert.ChangeType(value, UnderlyingType) 
Else 
    Me.InnerValue = value 
End If 

Convert.ChangeType이 질식 할 것이기 때문에 첫 번째 줄에서 Nothing을 확인합니다.이 문제는 발생하지 않지만 내 상황은 극도로 개방적입니다.

질문에 직접 답하지 않았 으면 좋겠어요. 이걸 잘 잡아 먹고 어디로 가야할 지 알 수 있겠지만, 방금 전에이 순간을 구현했고 테스트가 모두 끝났습니다.

+0

그가 원하는 모든 것은 기본 유형 이었으므로 필요한 것은 Nullable.GetUnderlyingType뿐입니다. –

+0

나는 그가 그것을 대부분 필요로하게 될 것이라고 생각한다.:) –

+0

우수한 게시물, 내 엉덩이를 구 했어요! – tbone

4
Nullable.GetUnderylingType(myType) 

nullable 유형이 아닌 경우 기본 유형을 반환하거나 null을 반환합니다.

+0

굉장해, 고마워! C#에서는'... typeof (Nullable <>)'을 컴파일 할 수 없었습니다 (나중에 이유를 알아낼 것입니다). 따라서 이마가 반복 된 헤드/데스크 상호 작용에서 완전히 절약되었습니다. 다른 솔루션보다 간단합니다. – Groxx

관련 문제