【发布时间】:2012-02-11 14:09:05
【问题描述】:
我正在尝试检查变量是否已定义为可为空的 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”为 False:
Not Nullable.GetUnderlyingType(GetType(Guid?)) Is Nothing
问题是我不知道如何从变量本身检索可空类型,以便对其进行测试。我只能获得底层(不可为空)系统类型。
Ed:解释为什么我需要知道。 :)
我写了一个 db 辅助函数。我将一个由公共成员组成的对象传递给它,表示表的行数据。成员是表列。
使用反射,我循环遍历这些公共成员以为命令对象创建一个 INSERT 语句,并使用这些成员中的值填充其参数。到目前为止一切顺利。
但是现在有一个表有一个 uniqueidentifier 列,我必须不从行对象中填充它,因为它默认为“NEWID()”(使用 SQL Server 2008)。我不想跳过所有 Guid 列,这很容易,我只想跳过在行数据类中定义为“Guid”(不可为空)的那些。
基本上,我使用的是 Guid? (Nullable) 类型,表示可以用数据填充该 uniqueidentifier 列。如果它不可为空,则告诉我跳过它,因为该列具有 NEWID() 默认值。
希望这是有道理的。如果有更好的方法让我知道要跳过哪些 guid 列以及要填充哪些列,我很想知道。这只是我认为可行的一种方法。
【问题讨论】:
-
您可以改用属性吗?用自定义属性标记标识符方法以指示它应该被忽略
-
@MarkJ,行数据类只是一堆公共成员,例如。
Public ClientFirstName As String。成员名称反映了 db 列名称。有没有办法在代码中为类成员添加特殊属性,然后可以通过反射访问? -
我还建议您研究 ORM 框架,例如 NHibernate 或实体框架,它们可以为您解决问题。
-
感谢@MarkJ,但这是关于应用于班级的属性,而我想要了解的是个人成员,而不是班级。
标签: vb.net reflection nullable