我想要做的是,根据T的类型做不同的操作.以下是我的问题的一个简单示例.
Public Shared Function Example(Of T)() As T
Dim retval As T
If TypeOf retval Is String Then
Dim myString As String = "Hello"
retval = myString
ElseIf TypeOf retval Is Integer Then
Dim myInt As Integer = 101
retval = myInt
End If
Return retval
End Function
Run Code Online (Sandbox Code Playgroud)
我得到错误"类型'字符串'的值'无法转换为'T'"与整数部分相同.如果我把它们转移到一个对象然后将它们转移到retval它可以工作,但我认为这会打败我的目的并且效率会降低.有任何想法吗?谢谢!
这可能有点晚了,但试试这个:
Public Shared Function CAnyType(Of T)(ByRef UTO As Object) As T
Return CType(UTO, T)
End Function
Public Shared Function ExecuteSQLstmtScalar(Of T)(ByVal strSQL As String) As T
Dim T_ReturnValue As T
' Here we have the result of a DB query '
Dim obj As Object = "Value from DB query cmd.ExecuteScalar"
Dim strReturnValue As Object = obj.ToString();
Try
Dim tReturnType As Type = GetType(T)
If tReturnType Is GetType(String) Then
Return CAnyType(Of T)(strReturnValue)
ElseIf tReturnType Is GetType(Boolean) Then
Dim bReturnValue As Boolean = Boolean.Parse(strReturnValue)
Return CAnyType(Of T)(bReturnValue)
ElseIf tReturnType Is GetType(Integer) Then
Dim iReturnValue As Integer = Integer.Parse(strReturnValue)
Return CAnyType(Of T)(iReturnValue)
ElseIf tReturnType Is GetType(Long) Then
Dim lngReturnValue As Long = Long.Parse(strReturnValue)
Return CAnyType(Of T)(lngReturnValue)
Else
MsgBox("ExecuteSQLstmtScalar(Of T): This type is not yet defined.")
End If
Catch ex As Exception
End Try
Return Nothing
End Function
Run Code Online (Sandbox Code Playgroud)
(分泌物将您的通用结果转换为对象,然后从类型Object转换为模板类型T).
PS:
您有责任确保您的代码能够正常使用可空类型和非可空类型,以及System.DbNull.Value.例如,当string为NULL且返回值类型为Boolean(不可为空)时.在旁注中,请注意VB Nothing不等于NULL,它等于C#default(T)
(例如Guid的System.Guid.Empty)
使用通用方法,T
每次都只有一种类型.假设你有代码调用Example(Of Integer)
.现在,在你的脑海里,替换T
为Integer
.生成的方法将包含这些行(以及其他行).
Dim retval As Integer
If TypeOf retval Is String Then
Dim myString As String = "Hello"
retval = myString
' more code follows '
Run Code Online (Sandbox Code Playgroud)
将String分配给类似的整数将永远不会起作用.当然,该代码也将永远不会执行,因为If-block阻止了,但代码仍然无法编译.(另一方面,上面的代码将无法编译,因为TypeOf关键字仅限于与引用类型一起使用,但这是另一个故事)
通常在创建泛型方法时,您将希望使用您获得的任何输入执行相同的操作,但是以类型安全的方式.如果您希望针对不同类型的输入具有不同的行为,则通常会通过重载方法来改善.
归档时间: |
|
查看次数: |
27883 次 |
最近记录: |