2012-01-16 5 views
0

J'essaie de vérifier si une variable a été définie comme Guid nulable. par exemple.VB.NET: Vérification si la variable est de Guid? (nullable) type

Dim myGuid As Nullable(Of Guid) ou Dim myGuid As Guid?

Il semble faire un myGuid.GetType renvoie le sous-jacents de type, qui est le type Guid, pas guid ?. Donc tester myGuid.GetType Is GetType(Guid?) retourne toujours False.

Comment puis-je savoir si myGuid est un type Nullable?


Ed: Je peux faire ce qui suit, qui renvoie correctement True pour "Guid?" et False pour « Guid »:

Not Nullable.GetUnderlyingType(GetType(Guid?)) Is Nothing

Le problème est que je ne sais pas comment récupérer le type nullable de la variable elle-même, afin de le tester. J'ai seulement pu obtenir le type de système sous-jacent (non-nullable).


Ed: Explication des raisons pour lesquelles j'ai besoin de savoir. :)

J'ai écrit une fonction d'assistance db. Je lui passe un objet composé de membres publics, représentant les données de ligne d'une table. Les membres sont les colonnes de la table. En utilisant la réflexion, je parcours ces membres publics pour créer une instruction INSERT pour un objet de commande et remplir ses paramètres avec les valeurs de ces membres. Jusqu'ici tout va bien.

Mais maintenant il y a une table qui a une colonne uniqueidentifier que je dois pas remplir à partir de l'objet ligne, comme par défaut "NEWID()" (en utilisant SQL Server 2008). Au lieu de sauter toutes les colonnes Guid, ce qui serait facile, je veux seulement ignorer celles définies dans la classe de données de la ligne comme "Guid" (non nullable).

Fondamentalement, j'utilise le Guid? (Nullable) pour indiquer que vous pouvez remplir cette colonne uniqueidentifier avec des données. Si elle est non-nullable, cela me dit de l'ignorer car la colonne a une valeur par défaut NEWID().

Espérons que cela a du sens. S'il y a une meilleure façon de savoir quelles colonnes à ignorer et celles à remplir, je serais impatient de savoir. C'est juste une approche que je pensais être faisable.

+0

Vous pourriez utiliser un attribut à la place? Marquez la méthode identificateur avec un attribut personnalisé pour indiquer qu'elle doit être ignorée – MarkJ

+0

@MarkJ, la classe de données de ligne est juste un groupe de membres publics, par exemple. 'Public ClientFirstName As String'. Le nom du membre reflète le nom de la colonne db. Existe-t-il un moyen d'ajouter des attributs spéciaux à un membre de la classe, dans le code, auquel on peut accéder par réflexion? –

+0

Oui, voir ces liens http://msdn.microsoft.com/en-us/library/71s1zwct.aspx et http://msdn.microsoft.com/en-us/library/z919e8tw.aspx – MarkJ

Répondre

0

Trouvé une solution!On peut dire qu'elle est impossible de déterminer si une seule variable est annulable mais, tant qu'il est membre d'une classe, la réflexion peut être utilisé comme ceci:

La classe:

Public Class testclass 
    Public intno As Int16 
    Public intyes As Int16? 
    Public guidno As Guid 
    Public guidyes As Guid? 
End Class 

Le code:

Dim oTest As New testclass 
For Each f As Reflection.FieldInfo In oTest.GetType.GetFields 
    Console.Write(f.Name & " is ") 
    If f.FieldType.IsGenericType AndAlso f.FieldType.GetGenericTypeDefinition() Is GetType(Nullable(Of)) Then 
    Console.WriteLine("Nullable") 
    Else 
    Console.WriteLine("Not Nullable") 
    End If 
Next 

La sortie:

intno n'est pas nullables
intyes est Nullable
guidno est pas annulable
guidyes est annulable

Merci à tous pour vos réponses.

1

Vous ne devriez pas vous en préoccuper si c'est un Nullable(Of Guid). Ce que vous devez faire est de savoir si c'est null ou Guid qui sont les 2 états possibles.

+1

@ ingredient_15939, puisque vous ne pouvez pas le savoir parce que c'est ainsi que fonctionnent les types Nullable, je vous demande pourquoi vous avez besoin de le savoir afin de vous proposer une approche alternative. –

+0

@competent_tech, oui, je sais qu'ils ne sont pas valables. Mais puisque la variable myGuid est déclarée comme Nullable (Of Guid) vous n'avez que deux possibilités: Elle peut être nulle, auquel cas vous ne pouvez évidemment pas connaître son type, ou elle peut être un Guid. C'était le but de ma réponse. –

+0

désolé, je comprends maintenant. –

0

Les objets basés sur des types NULL sont encadrés dans leur type sous-jacent s'ils ont une autre valeur dans une référence NULL.

object o = new Nullable<Guid>(Guid.NewGuid()); //no longer a nullable guid. 
+0

À la vôtre Magnus. J'ai trouvé que je pouvais le faire par réflexion, ce qui est génial. –

Questions connexes