首页 > 解决方案 > 试图在函数头中使用类型类型的变量 - 包含类型

问题描述

我知道很多问题是相似的,但可能是因为很多问题都与 C# 有关,我无法轻松地将其转换为 VB.Net,因此我无法在任何地方找到以下方法。函数Test获取一个参数TypToValidate ,该参数指定要检查的类型。

函数中的代码将一行中的一段从文本中读取到一个字符串变量中。根据读取的内容,该字符串可能是“abc”或“0.307”或“12”或其他任何内容。然后该函数必须检查该字符串是否可以转换为TypeToValidate指定的类型。如果是这样,该函数将经过验证的文本块作为字符串返回;如果不是,它会引发错误。

Function Test(... , Optional ByVal TypeToValidate as Type = String) as String
  ChunkOfText = SomeFile.ReadLine
  If TypeOf(ChunkOfText) Is TypeToValidate Then 
    Return ChunkOfText
  Else
    Throw ex As ApplicationException ' or whatever like this
  End If 
  ...

我知道“类型”本身不能用作类型,类型的类型,将类型作为值。Iow,我不能将类型传递给函数,或者可以吗?

显然,我可以使用

Function Test(..., Optional ByVal TypeToValidate as String = "String") as String

并将String(如 'Byte', 'Integer', 'Int32', ...)传递给函数而不是Type,但这似乎不太专业......并且允许出错。任何帮助,最好是在 VB.Net 中?

标签: vb.nettypestypeof

解决方案


我认为可选参数在这里不起作用,因为它必须使用常量表达式进行初始化。

一个类型的变量Type必须与另一个类型Type的表达式进行比较=。这只是测试两个值是否相等。

Function Test(someVar As Object, typeToValidate As Type) As Boolean
    Return someVar?.GetType() = typeToValidate
End Function

.GetType()应用于变量获取Type描述对象的运行时类型的对象。

(我在这里使用了一个空条件运算符,以防值为Nothing。)


另一种可能性是使用泛型函数并使用类型名称(作为标识符给出,而不是字符串)或泛型类型参数进行TypeOf someVar Is T测试。T

Function Test(Of T)(someVar As Object) As Boolean
    Return TypeOf someVar Is T
End Function

然后,我们可以用

Dim obj As Object
obj = "Hello"

If Test(Of String)(obj) Then
    Console.WriteLine("obj is a String")
End If

请参阅:Visual Basic 中的通用过程


还要注意,写类似的东西没有意义

If someCondition Then
    Return True
Else
    Return False
End If

someCondition(可以是任何布尔表达式)已经产生了值Trueor False。因此,您可以简单地将其返回

Return someCondition

推荐阅读