VB.NET:检查变量是否是Guid? (可空)类型

时间:2012-01-16 16:49:24

标签: vb.net reflection nullable

我正在尝试检查变量是否已被定义为可以为空的Guid。例如

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

似乎正在执行myGuid.GetType返回底层类型,即Guid类型,而不是Guid?因此,测试myGuid.GetType Is GetType(Guid?)始终返回False。

如何确定myGuid是否为可空类型?


Ed:我可以执行以下操作,正确地为“Guid”返回True? “Guid”是假的:

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

问题是我不知道如何从变量本身检索可空类型,以便测试它。我只能获得底层(非可空)系统类型。


爱德:解释为什么我需要知道。 :)

我编写了一个db helper函数。我传递一个由公共成员组成的对象,表示表的行数据。成员是表格列。

使用反射,我循环遍历这些公共成员,为命令对象创建INSERT语句,并使用这些成员中的值填充其参数。到目前为止一切都很好。

但现在有一个表有一个uniqueidentifier列,我必须从行对象填充,因为它默认为“NEWID()”(使用SQL Server 2008)。我只想跳过行数据类中定义的“Guid”(不可为空)。而不是跳过所有Guid列,这很简单。

基本上,我正在使用Guid? (Nullable)类型表示可以使用数据填充该uniqueidentifier列。如果它不可为空,那就告诉我跳过它,因为该列有一个NEWID()默认值。

希望这是有道理的。如果有更好的方式让我知道要跳过哪些guid列以及要填充哪些,我会很想知道。这只是我认为可行的方法。

3 个答案:

答案 0 :(得分:1)

你真的不应该关心它是Nullable(Of Guid)。如果nullGuid是两种可能的状态,您应该注意的是什么。

答案 1 :(得分:0)

基于可空类型的对象,如果它们的值为null引用,则将其置于其基础类型。

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

答案 2 :(得分:0)

找到解决方案!似乎不可能确定单独的变量是否可以为空,但只要它是类的成员,就可以像这样使用反射:

班级:

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

代码:

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

输出:

  

intno不可为空   intyes是Nullable
  guidno不可为空   guidyes是Nullable

感谢您的回复。