【问题标题】:VB.NET: Checking if variable is of Guid? (nullable) typeVB.NET:检查变量是否属于 Guid? (可为空的)类型
【发布时间】: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


【解决方案1】:

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

班级:

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 可以为空
guidno 不可为空
guidyes 可以为空

感谢大家的回复。

【讨论】:

    【解决方案2】:

    如果基于可空类型的对象具有其他空引用的值,则将其装箱到其基础类型。

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

    【讨论】:

    • 干杯马格努斯。我发现我可以通过反射来做到这一点,这很棒。
    【解决方案3】:

    你真的不应该关心它是否是Nullable(Of Guid)。您应该关心的是 nullGuid 这两种可能的状态。

    【讨论】:

    • @ingredient_15939,既然你不知道这一点,因为 Nullable 类型就是这样工作的,我问你为什么需要知道这一点才能为你提供替代方法。
    • @competent_tech,是的,我知道它们不可为空。但是由于 myGuid 变量被声明为 Nullable(Of Guid),因此您只有两种可能性:它可以为 null,在这种情况下您显然无法知道它的类型,或者它可以是 Guid。这就是我回答的重点。
    • @Darin,别担心,我已经用解释编辑了这个问题。
    猜你喜欢
    • 2010-12-25
    • 2011-01-13
    • 2020-03-21
    • 1970-01-01
    • 2012-02-05
    • 1970-01-01
    相关资源
    最近更新 更多