VB.NET:使用Type参数vs使用泛型函数?

时间:2017-06-12 09:03:26

标签: vb.net generics types

我不确定使用(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

1 个答案:

答案 0 :(得分:0)

编译器抱怨泛型函数有多种原因,但它与泛型无关。

首先,结果变量的类型为T:

Dim result = JsonConvert.DeserializeObject(Of T)(jsonData)

我不认为result.Successresult.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)