Dot-Net
“字元串”的值無法轉換為“T”類型。獲取查詢字元串的通用函式?
我有這個功能:
Public Shared Function GetQueryStringValue(Of T As Structure)(ByVal queryStringVariable As String) As T Dim queryStringObject As Nullable(Of T) = Nothing If queryStringVariable <> Nothing Then If HttpContext.Current.Request.QueryString(queryStringVariable) IsNot Nothing Then queryStringObject = DirectCast(HttpContext.Current.Request.QueryString(queryStringVariable), T) End If End If Return queryStringObject End Function我希望這樣稱呼:
Dim userId As Integer = SessionUtil.GetSessionValue(Of Integer)("uid")我試圖使其通用,因為最後一個查詢字元串值可能至少是一個整數或一個字元串,但也可能是一個雙精度值和其他值。但我得到了錯誤:
Value of 'String' cannot be converted to Type 'T'我對 Session 變數做了同樣的事情,它奏效了。任何人都知道使這項工作的方法嗎?
**編輯:**下面的 Jonathan Allen 使用 CObj() 或 CTypeDynamic() 有一個更簡單的答案。但以下也適用於將字元串轉換為可空類型(int、double 等…)
Dim conv As TypeConverter = TypeDescriptor.GetConverter(GetType(T)) queryStringObject = DirectCast(conv.ConvertFrom(queryStringVariable), T)
最安全的方法是使用 CTypeDynamic。這將確保使用隱式/顯式運算符。
Function Convert(Of T)(s As String) As T Return Microsoft.VisualBasic.CTypeDynamic(Of T)(s) End Function這對簡單類型有效,但對複雜類型無效。
Function Convert(Of T)(s As String) As T Return CType(CObj(s), T) End Function
我認為問題在於您不能將字元串轉換為整數(或者實際上是許多類型)。它需要被解析。
我不確定,但 CType() 可能會代替 DirectCast() 來完成這項工作。