2016-10-05 2 views
0

Wie kann ich eine Typdefinition verwenden, die von einer Funktion zurückgegeben wird? Die folgende Funktion kompiliert, aber ich bekomme: BC30002 "Typ 'DB.ResolveType' ist nicht definiert.", wenn ich versuche, es zu benutzenVorgehensweise: Verwenden Sie eine Typdefinition, die von einer Funktion zurückgegeben wird?

Public NotInheritable Class DB 
    Public Shared Function ResolveType(type As String) As Type 
     Select Case type 
      Case "Stop-Action-Request" : Return GetType(cheque_action) 
      Case "Cheque-Book-Request" : Return GetType(cheque_book_request) 
      Case "Confirm-Action-Request" : Return GetType(cheque_action) 
      Case "FX-Transfer-Request" : Return GetType(cheque_action) 
      Case "Mobile-Banking-Request" : Return GetType(mobile_banking_request) 
      Case "SMS-Alerts-Request" : Return GetType(sms_alert_request) 
     End Select 

     Return Nothing 
    End Function 
End Class 

    Protected Sub Page_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load 
     Try 
      Dim d = Request.Form("payload") 

      Dim r = JsonConvert.DeserializeObject(Of request)(d) 

      ** this line fails: ** 
      Dim p = JsonConvert.DeserializeObject(Of DB.ResolveType(r.req_type))(r.data) 

      DB.new_request(r.req_type, r.src, r.data) 
     Catch ex As Exception 

     End Try 
    End Sub 
+0

Sie können keine Generika wie diese verwenden. Wenn Sie eine generische Methode haben, müssen Sie einen konstanten definierten Typ angeben, der zur Kompilierungszeit bekannt ist. In Ihrem Beispiel versuchen Sie, einen Typ anzugeben, der zur Laufzeit dynamisch aufgelöst wird, was nicht möglich ist. –

+0

@AlexB. Was wäre die bevorzugte Methode, um dies oder Ähnliches zu erreichen? Ich möchte dynamisch bestimmen, welcher Typ zu jsonDecode ist. Ich habe Strings, die ich nachschlagen kann, um zu bestimmen, welche Decodierung (Klasse) anzuwenden ist. –

+1

Verwenden Sie einfach eine andere Überladung von DeserializeObject, wie 'JsonConvert.DeserializeObject (r.data, DB.ResolveType (r.req_type))' –

Antwort

1

Sie können keine Generika wie diese verwenden.

Wenn Sie eine generische Methode haben, müssen Sie einen konstanten definierten Typ bereitstellen, der zur Kompilierungszeit bekannt ist, z.

In Ihrem Beispiel versuchen Sie, einen Typ anzugeben, der zur Laufzeit dynamisch aufgelöst wird, was nicht möglich ist.

Verwenden Sie einfach eine andere Überladung von DeserializeObject, wenn Sie möchten, dass der Objekttyp dynamisch aufgelöst wird, z.

JsonConvert.DeserializeObject(r.data, DB.ResolveType(r.req_type))

0

Ihre Return-Anweisungen korrekt zu sein scheinen. "Dim p = MyType.MyFunction: aber man kann nicht so etwas wie "DeserializeObject (Of DB.ResolveType (r.req_type)) (r.data)"

Generika Operationen können Typen als Argumente (Beispiel schreiben (of String) (Argument) "), aber Sie können kein Objekt (vom Typ" Typ "oder irgendeinen anderen Typ) anstelle des Typarguments verwenden

Verwandte Themen