我不确定使用(Of T)
的通用函数和使用类型参数returnType As Type
之间的区别是什么,以及将JSON字符串转换为函数的函数的最佳方法是什么对象子类型如下图所示。
当我尝试访问事先知道其子类型的对象的属性时,以及尝试将对象强制转换为所需的子类型时,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在使用通用方法时会抱怨,但在将类型作为参数传递时却不会抱怨?
我正在使用JsonConvert
框架中的Newtonsoft.Json
类。
参考:http://www.newtonsoft.com/json/help/html/Overload_Newtonsoft_Json_JsonConvert_DeserializeObject.htm
答案 0 :(得分:0)
编译器抱怨泛型函数有多种原因,但它与泛型无关。
首先,结果变量的类型为T:
Dim result = JsonConvert.DeserializeObject(Of T)(jsonData)
我不认为result.Success
和result.Errors
是在T中定义的。所以很明显编译器抱怨这一点。 如果您想使用这些功能,请不要使用T而是使用响应。
此外,您正在尝试将变量结果转换为Response(类型为T):
result = TryCast(result, Response)
您不能将结果转换为类型为Response的结果,因为结果是T类型。然后它应该是:
result = TryCast(result, T)
但是你根本不需要这个陈述,因为结果已经被转换为T。
一般情况下:如果不需要,请不要使用Object。使用通用函数。始终使用最具体的类型。
使用指定的类型调用函数:Execute(Of Response)(jsonData)或将函数更改为:
Public Overloads Function Execute(jsonData As String) As Response Implements IHandler.Execute
Dim result = JsonConvert.DeserializeObject(Of Response)(jsonData)