我想知道是否有任何方法可以在類似于事件引數的函式中訪問預期的資料型別。我懷疑這是可能的,盡管這將是一個很好的功能。
我經常使用(陳舊且雜亂無章的)Mysql 資料庫,通過 VB.Net 創建介面。通常我會有一個可選欄位,它在資料庫中包含一個 NULL 值。在將資料傳入和傳出資料庫時,我經常處理由于 NULL 和 dbnull 值引起的錯誤。
使事情復雜化的是,我經常處理意想不到的資料型別。我可能有一個整數零、一個雙零、一個空字串或一個字串零。
因此,我花費了大量代碼來檢查每個條目是否屬于預期型別,或者根據情況將 NULL 轉換為零或空字串。我寫了一個函式 ncc(null catch convert) 來加速這個程序。
Public Function ncc(obj As Object, tp As Type) As Object 'Null Catch Convert Function...
我的函式運行良好,但每次呼叫該函式時都必須手動設定型別。如果可以訪問預期的運算式型別,就會容易得多。這是我的意思的一個例子。
Dim table as datatable
adapter.fill(table)
dim strinfo as string
dim intinfo as long
strinfo = ncc(table.Rows(0).Item(0),gettype(String)) 'here a string is expected
intinfo = ncc(table.Rows(0).Item(0),gettype(Long)) 'here a long is expected
如果可以直接從函式訪問預期的型別,效率會高得多。
這樣的事情會很棒:
Public Function ncc(obj As Object, optional tp As Type = nothing) As Object
If tp Is Nothing Then tp = gettype(ncc.expectedtype)
這樣我就不必對每一行的型別進行硬編碼。
strinfo = ncc(table.Rows(0).Item(0))
uj5u.com熱心網友回復:
您可以使ncc函式通用以簡化呼叫它:
Public Function ncc(Of T)(obj As T) As T
If DbNull.Value.Equals(obj) Then Return Nothing
Return Obj
End Function
這種函式在某些情況下能夠推斷出型別,但如果有任何可能為 null 的情況,您仍然需要包含一個型別名稱(因為 DBNull 將是這些值的推斷型別)。優點是不需要呼叫gettype(),因此獲得了小程度的型別安全:
strinfo = ncc(Of String)(table.Rows(0).Item(0))
但是我認為如果您的引數不能隱式轉換為所需的型別,那么這在運行時爆炸的可能性很小。您應該做的是添加函式以接受整行并回傳組合型別。這些函式可以作為目標型別的靜態/共享成員存在:
Shared Function FromDataRow(IDataRow row) As MyObject
你為每一行呼叫它是這樣的:
Dim record As MyObject = MyObject.FromDataRow(table.Rows(i))
uj5u.com熱心網友回復:
但是,你的問題仍然存在。
如果資料庫行中的列為空,會發生什么情況?
那么你不會得到資料型別!
更糟?假設資料列為 null,您是否仍要將 null 回傳到該變數中?
為什么不為空值指定一個值。
您可以在傳遞的值上使用“gettype”,但如果資料庫列為空,則您無法確定型別,然后您又不得不輸入您想要的型別作為第二個引數。
但是,您可以采用 nz() 函式(如在 VBA/Access 中)。
所以,這可能會更好:
Public Function ncc(obj As Object, Optional nullv As Object = Nothing) As Object
If obj Is Nothing OrElse IsDBNull(obj) Then
Return nullv
End If
Return obj
End Function
所以,我不關心資料庫列是否為空或數字,對于這樣的數字,我想要 0。
所以
dim MyInt as integer
Dim MyDouble As Double
MyInt = ncc(rstData.Rows(0).Item("ContactID"), 0)
MyDouble = ncc(rstData.Rows(0).Item("ContactID"), 0)
dim strAddress as string = ""
strAddress = ncc(rstData.Rows(0).Item("Address"), "")
由于在幾乎所有情況下,您都需要處理資料庫中的空值,因此上述內容不僅適用于所有資料型別,而且還可以讓您進行即時轉換。
我的意思是,您可以宣告諸如整數之類的變數以允許空值。
例如:
dim myIntValue as integer?
但是,我不確定上面會產生比它解決的問題更多的問題。
所以,
uj5u.com熱心網友回復:
你無法準確地得到你想要的,因為一個函式永遠不知道它將如何被使用。不能保證它會在賦值陳述句的右側。
如果你想了解雙方,你要么需要分配給一個自定義型別(這樣你就可以多載賦值運算子),要么你需要使用 aSub而不是賦值。
你可以做這樣的事情(未經測驗):
Public Sub Assign(Of T)(ByVal field As Object, ByRef destination As T,
Optional ByVal nullDefault As T = Nothing)
If TypeOf field Is DBNull Then
destination = nullDefault
Else
destination = CType(field, T)
End If
End Sub
我沒有對此進行測驗,所以我不完全確定編譯器是否允許轉換,但我認為它會因為field是 type Object。請注意,如果field不能轉換為T.
您甚至可以考慮施加一個要求T成為值型別的約束,但我認為這不太可能起作用,因為您可能需要處理String參考型別(即使它基本上像值型別一樣)。
因為目標是一個引數,所以您永遠不需要指定泛型型別引數,它會被推斷出來。
轉載請註明出處,本文鏈接:https://www.uj5u.com/caozuo/536786.html
標籤:网络功能参数事件参数
上一篇:TF.exe直接執行不提示checkin確認,不使用作業系統shell啟動行程
下一篇:誰能幫我理解這段代碼有什么問題
