2016-03-11 3 views
0

Я пытаюсь выяснить проблему с загрузкой в ​​результате функции Json.Decode от System.Web.Helpers при повторении каждого из полей.Unwrapping JsonDynamicObject

В моем open source project у меня есть система расширяемого типа, которая позволяет разработчикам расширений создавать свои собственные пользовательские типы, которые могут быть повторно использованы в своих проектах или других. Чтобы сохранить и загрузить эти настраиваемые типы в один и тот же файл JSON в качестве остальной части сцены в этом визуальном редакторе, я использую пространство имен System.Reflection.Emit для сохранения и загрузки этих настраиваемых типов.

Поскольку эти типы динамически загружаются из внешнего DLL-файла, мое приложение не знает, что представляют собой эти типы до выполнения. Поэтому использование метода Json.Decode<> - это просто не-go.

Функциональность сохранения работает должным образом. Однако у меня проблема с функциональностью загрузки.

Следующий код используется для загрузки файла JSON, где instanceType определяется как тип не распознается внутренне редактором:

public static void Open(object instance, dynamic data) 
{ 
    var type = instance.GetType(); 
    var properties = type.GetProperties(); 
    var dataFields = ((ObjectHandle)data).Unwrap().GetType().GetFields(); 

    foreach (var pr in properties) 
    { 
     foreach (var field in dataFields) 
     { 
      if (pr.CanWrite && pr.Name == field.Name) 
      { 
       var value = field.GetValue(data); 

       if (pr.PropertyType == typeof(Color)) 
       { 
        value = Color.FromArgb(value); 
       } 

       pr.SetValue(instance, field.GetValue(data)); 
      } 
     } 
    } 
} 

Строка, начинающаяся var dataFields где речь идет, и я исследовал онлайн насколько это возможно для потенциального решения, но я не могу найти один из них, относящийся к JsonDynamicObject.

Ошибка заключается в следующем:

An unhandled exception of type 'System.InvalidOperationException' occurred in System.Web.Helpers.dll 

Additional information: Unable to convert to "System.Runtime.Remoting.ObjectHandle". Use Json.Decode<T> instead. 

Теперь я не могу использовать Json.Decode<T> по причинам, которые я только что упомянул, так есть ли другой способ, которым я могу читать поля этого динамического объекта?

Я попытался изменить второй тип аргумента к объекту, но это привело к ошибке литья:

An unhandled exception of type 'System.InvalidCastException' occurred in sd2api.dll 

Additional information: Unable to cast object of type 'System.Web.Helpers.DynamicJsonObject' to type 'System.Runtime.Remoting.ObjectHandle'. 
+1

Я бы использовал [Json.Net] (http://www.newtonsoft.com/json) вместо того, чтобы изобретать колесо ... У него есть все необходимые функции – Eser

ответ

0

После переключения на Json.NET, и опуская бросок в приведенном выше коде, то теперь в формате JSON надлежащим образом декодируется.

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