2008-08-31 26 views
10

Ich versuche, ein Dataset basierend auf den Eigenschaften eines Objekts zu erstellen. Zum Beispiel habe ich eine Instanz einer Klasse Person mit Eigenschaften, einschließlich ID, Vornamen, Nachnamen, DOB usw. Reflexion verwenden, ich bin Hinzufügen von Spalten zu einem neuen Datensatz basierend auf den Objekteigenschaften:VB.NET Holen zugrunde liegenden system.type von Nullable Typ

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

Mein Problem ist, dass einige dieser Eigenschaften nullbare Typen sind, die von Datasets nicht unterstützt werden. Gibt es eine Möglichkeit, den zugrunde liegenden Systemtyp von einem Nullwerttyp zu extrahieren?

Danke.

Antwort

1

Ich vermute, dass das Problem erkennt, ob die Eigenschaft nullfähig ist oder nicht. In C# tun Sie dies mit diesem Code:

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

... aber ich bin mir nicht sicher, was das Äquivalent dieser letzten Klausel in VB.NET ist.

+0

if (type.IsGenericType AndAlso type.GetGenericTypeDefinition ist GetType (Nullable)) –

+0

Das ist eigentlich keine korrekte Übersetzung zu VB, seltsam genug. Schau dir meine Antwort an. –

+0

Ja, 'Nullable' und' Nullable <> 'sind zwei verschiedene Typen. –

0

@Mendelt Siebenga: Sie können GetType nur für die Eigenschaft value aufrufen, wenn die Variable nicht auf null gesetzt ist. Andernfalls erhalten Sie eine Ausnahme.

Was Sie tun möchten, ist die "GetValueOrDefault" -Eigenschaft und rufen Sie GetType auf, da Sie garantiert sind, dass es nicht null sein wird. Beispiel:

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

Sie können auch die GetGenericParameters()-Methode für diesen Typ verwenden. myNullableObject.GetType().GetGenericParameters()[0] sollte Ihnen die Art der nullbaren geben es ist (so Guid, Int32, etc.)

15

Hier ist Ihre Antwort in VB. Dies kann für Ihre Zwecke übertrieben sein, aber es könnte auch für andere Leute nützlich sein.

First off, hier ist der Code, um herauszufinden, ob Sie mit einem Nullable-Typ zu tun hat:

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

Beachten Sie die ungewöhnliche Syntax in der GetType. Es ist notwendig. GetType (NULL) als einen der vorgeschlagenen Kommentatoren zu tun, funktionierte nicht für mich.

So mit dem bewaffnet, können Sie etwas tun ... Hier, in einem ORM-Tool, ich versuche Werte in einen generischen Typ zu erhalten, oder nicht Nullable sein kann:

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 

Beachten Sie, dass ich in der ersten Zeile nach Nothing suche, weil Convert.ChangeType daran ersticken wird ... Möglicherweise haben Sie dieses Problem nicht, aber meine Situation ist extrem offen.

Hoffentlich, wenn ich deine Frage nicht direkt beantwortet habe, kannst du das ausnutzen und dich dahin bringen, wo du hin musst - aber ich habe das gerade eben umgesetzt und meine Tests sind alle vorüber.

+0

Alles, was er fragte, war der zugrunde liegende Typ, also alles, was Sie brauchen, ist Nullable.GetUnderlyingType. –

+0

Ich vermute, er wird das meiste davon brauchen.:) –

+0

Ausgezeichneter Beitrag, speicherte meinen Esel! – tbone

4
Nullable.GetUnderylingType(myType) 

gibt den zugrunde liegenden Typ oder null zurück, wenn es sich nicht um einen Nullwerttyp handelt.

+0

Super, danke! in C# konnte ich nicht "... ist typeof (Nullable <>)" kompilieren (ich werde herausfinden, warum später), so dass dies meine Stirn vor wiederholten Kopf/Schreibtisch-Interaktionen komplett ersparte. Einfacher als die anderen Lösungen auch. – Groxx

Verwandte Themen