2016-10-05 6 views
0

Как я могу использовать определение типа, возвращаемое функцией?Практическое руководство. Использование определения типа, возвращаемого функцией?

Функция ниже компилируется, но я получаю: BC30002 «Тип« DB.ResolveType »не определен»., когда я пытаюсь использовать его

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

Вы не можете использовать такие дженерики. Если у вас есть общий метод, вы должны указать постоянный определенный тип, который известен во время компиляции. В вашем примере вы пытаетесь предоставить тип, который динамически разрешается во время выполнения, что невозможно. –

+0

@AlexB. что было бы предпочтительным методом достижения этого или подобного. Я хочу динамически определить, какой тип для jsonDecode. У меня есть строки, которые я могу найти, чтобы определить, какое декодирование (класс) применять. –

+1

Просто используйте другую перегрузку DeserializeObject, например 'JsonConvert.DeserializeObject (r.data, DB.ResolveType (r.req_type))' –

ответ

1

Вы не можете использовать такие дженерики.

Если у вас есть общий метод, вы должны указать постоянный определенный тип, который известен во время компиляции, например. JsonConvert.DeserializeObject(Of String)(data)

В вашем примере вы пытаетесь предоставить тип, который динамически разрешается во время выполнения, что невозможно.

Просто используйте другую перегрузку DeserializeObject, если хотите, чтобы тип объекта был динамически разрешен, например.

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

0

ваши возвратные заявления кажутся правильными. , но вы не можете написать что-то вроде "DeserializeObject (Of DB.ResolveType (r.req_type)) (r.data)"

дженериков операции могут иметь типы в качестве аргументов (пример: "Дим р = MyType.MyFunction (из String) (аргумент) "), но вы не можете использовать obbject (типа« Тип »или любой другой тип) вместо аргумента типа

Смежные вопросы