Я пытаюсь выяснить проблему с загрузкой в результате функции 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'.
Я бы использовал [Json.Net] (http://www.newtonsoft.com/json) вместо того, чтобы изобретать колесо ... У него есть все необходимые функции – Eser