2012-06-13 1 views
1

ОК, этот вопрос звучит, может быть, немного запутанным, поэтому я попытаюсь объяснить его примером.Как заполнить переменные объекта, определенные в словаре на основе JSON?

Притворись у вас есть объект, как это:

Class Something 
    Private varX As New Integer 
    Private varY As New String 

'[..with the associated property definitions..] 

    Public Sub New() 
    End Sub 

End Class 

, а другой с:

Class JsonObject 
    Inherits Dictionary(Of String, String) 

    Public Function MakeObject() As Object 'or maybe even somethingObject 
     Dim somethingObject As New Something() 

     For Each kvp As KeyValuePair(Of String, String) In Me 
      'Here should happen something to use the Key as varX or varY and the Value as value for the varX or varY 
      somethingObject.CallByName(Me, kvp.Key, vbGet) = kpv.Value 

     Next 

     return somethingObject 
    End Function 

End Class 

Я получил 'CallByMe()' функции из previous question of myself

+1

Хм, в чем вопрос? –

+0

Да, я случайно нажал на возврат. Теперь все готово – Highmastdon

+0

Это еще не вопрос. Вы просто показываете код. Теперь, что вы хотите знать? Что с этим не так? –

ответ

0

CallByName работ отличается от того, как вы пытаетесь его использовать. Посмотрите на документацию, она расскажет вам, что в данном конкретном случае правильное использование будет

CallByName(Me, kvp.Key, vbSet, kpv.Value) 

Однако функция CallByName является частью библиотеки VB, который не поддерживается на всех устройствах (в частности, это ISN» t включен в платформу .NET Mobile), и, следовательно, лучше не использовать его.

Использование правильного отражения немного сложнее, но гарантированно работает на всех платформах.

Dim t = GetType(Something) 
Dim field = t.GetField(kvp.Key, BindingFlags.NonPublic Or BindingFlags.Instance) 
field.SetValue(Me, kvp.Value) 
+0

Спасибо за указание рабочей версии CallByName(). Да, я должен был посмотреть в документации. Но на самом деле я не нахожу рефлексию для работы (да, я знаю, что это не то место, где нужно просить работать с исходным кодом, а указывать в правильном направлении ...). – Highmastdon

+0

То, что я хочу, кроме того, заключается в том, чтобы сделать этот общий для любого объекта объект, передав «objectTypeName» желаемого объекта, который должен быть «десериализован». Поэтому я подумал о 'MakeObject (ByVal ObjectTypeName As String)'. Поэтому я мог бы создать переменную 'As' этого конкретного типа. Это возможно? – Highmastdon

+0

@Highmastdon Нет, это невозможно. Однако вы можете передать экземпляр 'System.Type' для метода, а затем использовать' Activator.CreateInstance' для создания этого типа - с некоторыми ограничениями (посмотрите на документацию). Тем не менее, общий метод может быть лучшим выбором. Кстати, почему бы вам не взять [существующий десериализатор JSON] (http://msdn.microsoft.com/en-us/library/system.web.script.serialization.javascriptserializer.aspx), который делает именно это? Наконец, код, который я написал, должен работать как есть. Однако обратите внимание на небольшое изменение, которое я только что сделал (исправление ошибки). –

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