(Of T)
を使用するジェネリック関数を使用する場合と、タイプパラメータreturnType As Type
を使用する場合の違いがわかりません。また、以下に示すように、JSONストリングをオブジェクトサブタイプに変換する関数にとって最善のアプローチはありません。VB.NET:タイプ引数と汎用関数を使用する
Visual Studioでは、あらかじめサブタイプを知っているオブジェクトのプロパティにアクセスしようとすると、そのオブジェクトを目的のサブタイプにキャストしようとすると文句を言います。ただし、汎用関数アプローチを使用する場合にのみこれを実行します。
後で実装するために複数のクラスのインターフェイスに含めることができるように、関数シグネチャが十分に汎用的である必要があります。一般的なアプローチを使用しますが、引数としてタイプを渡すときに文句を言わないとき
Public Overloads Function Execute(jsonData As String, returnType As Type) As Object Implements IHandler.Execute
' Deserializes the JSON to the specified .NET type.
Dim result = JsonConvert.DeserializeObject(jsonData, returnType)
' Visual Studio does not complain, and the function still works
' without the need of explicitly converting and checking:
' result = TryCast(result, Response)
' If result Is Nothing Then
' Throw New Exception("Conversion failed")
' End If
' Visual Studio does not complain:
if result.Success Then
ProcessMessage(result.Message)
ElseIf result.Errors.length > 0 Then
HandleErrors(result.Errors)
End If
Return result
End Function
Public Overloads Function Execute(Of T)(jsonData As String) As T Implements IHandler.Execute
' Deserializes the JSON to the specified .NET type.
Dim result = JsonConvert.DeserializeObject(Of T)(jsonData)
' Visual Studio complains:
result = TryCast(result, Response)
If result Is Nothing Then
Throw New Exception("Conversion failed")
End If
' Visual Studio complains:
if result.Success Then
ProcessMessage(result.Message)
ElseIf result.Errors.length > 0 Then
HandleErrors(result.Errors)
End If
Return result
End Function
何最善のアプローチは、両者の違いは何であり、なぜVisual Studioは、文句を言うのでしょうか?
Newtonsoft.Json
フレームワークのJsonConvert
クラスを使用しています。
参考:http://www.newtonsoft.com/json/help/html/Overload_Newtonsoft_Json_JsonConvert_DeserializeObject.htm
:dataResultは何ですか?オブジェクトをデシリアライズしていますが、(未知の?)データ結果の変換で結果を上書きするときに、実際にオブジェクトを使用していません。 –
@RuardvanElburgそれは重大な間違いではありませんでした。それは "結果"だったはずですが、悲しいことに、解決策とは関係ありません。私は後でこのコードの一部を追加して問題をさらに強調し、それを間違って入力しました。それに気づいてくれてありがとう。 – Mayron