Приведение результатов JSON в сценарий # - PullRequest
0 голосов
/ 24 июля 2010

Я пытаюсь сделать что-то вроде следующего в Script #

jQuery.GetJson("./GetData/", delegate(object json)
{
    //json = {"Name":"Fred"}    
    Person p = (Person)json;
    Script.Alert(p.Name);
});

Очевидно, что прямое приведение не работает, потому что объект Person на стороне очистки фактически использует set_Name, а свойство Name является приватным. Кажется, я не могу найти что-то встроенное в Script # для поддержки этого, я просто пропускаю это или мне придется делать это самому?

Ответы [ 2 ]

1 голос
/ 28 июля 2010

Я вижу, что это уже ответили. Вам нужно явно привести объект в действие, если кто-то подходит и почесывает голову, вот как вы это делаете:

    [Imported]
    [IgnoreNamespace]
    public class Person
    {
        public string fullname;
        public string address;

        public static implicit operator Person(Dictionary o) { return null; }
    }

Тогда в вашем GetJson:

jQuery.GetJson("GetData", delegate(object sender) {
    Person p = Dictionary.GetDictionary(sender);  
}); 
0 голосов
/ 24 июля 2010

Лучшим вариантом для настройки десериализации является рукописный конструктор или фабричный метод. Это вполне справедливо в любой среде - если ваш базовый тип не совместим с сериализацией один-к-одному, вам нужно быть более конкретным.

Мы использовали Script # для большого проекта, и, как правило, это был наш подход в таких ситуациях. Тем не менее, мы обычно пытаемся писать свои собственные типы, используя свойства, чтобы десериализация работала более естественно.

Можно ли предположить, что по какой-то причине у вас нет контроля над определением класса Person? Если это не так, я настоятельно рекомендую вам изменить класс для использования свойства «Имя» с собственным полем «имя». Это не только более идиоматично, но и может избавить вас от хлопот.

Edit:

Написал с выключенным мозгом. Пойду прости. Я должен был сказать, что мы пытаемся написать классы на стороне сценария, используя поля, а не свойства. С другой стороны, наши потребности от сервера к клиенту настолько различны, что мы даже не пытаемся использовать одну и ту же библиотеку с обеих сторон, поэтому мы можем с этим справиться.

...