我正在尝试检查变量是否已被定义为可以为空的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列以及要填充哪些,我会很想知道。这只是我认为可行的方法。
答案 0 :(得分:1)
你真的不应该关心它是Nullable(Of Guid)
。如果null
或Guid
是两种可能的状态,您应该注意的是什么。
答案 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
感谢您的回复。