Имя элемента для rootess classess с XmlSerializer [duplicate]

Ваша проблема в том, что в moveToLocation вы используете document.getElementById, чтобы попытаться получить объект Map, но это только дает вам HTMLDivElement, а не элемент google.maps.Map, который вы ожидаете. Таким образом, ваша переменная map не имеет функции panTo, поэтому она не работает. То, что вам нужно, - это белка map где-то куда-то, и она должна работать так, как планировалось. Вы можете просто использовать глобальную переменную следующим образом:

var map;      // global variable

function initialize() {
    var mapOptions = {
        center: new google.maps.LatLng(0, 0),
        zoom: 4,
        mapTypeId: google.maps.MapTypeId.ROADMAP
    };
    // assigning to global variable:
    map = new google.maps.Map(document.getElementById("map_canvas"),
        mapOptions);
}

function moveToLocation(lat, lng){
    var center = new google.maps.LatLng(lat, lng);
    // using global variable:
    map.panTo(center);
}

См. Рабочий jsFiddle здесь: http://jsfiddle.net/fqt7L/1/

1
задан Lock 29 May 2017 в 03:00
поделиться

1 ответ

В ситуациях, когда у вас есть поток XML, содержащий один из нескольких возможных типов документов, вы можете построить XmlSerializer для каждого типа и вызвать XmlSerializer.CanDeserialize(XmlReader) , чтобы последовательно проверить, можно ли десериализовать документ в этот тип. Этот метод не продвигает XmlReader мимо корневого элемента, поэтому его можно вызвать несколько раз, не перечитывая поток.

Например, вы можете ввести следующий метод расширения:

public static partial class XmlSerializerExtensions
{
    public static object DeserializePolymorphicXml(this string xml, params Type[] types)
    {
        using (var textReader = new StringReader(xml))
        {
            return textReader.DeserializePolymorphicXml(types);
        }
    }

    public static object DeserializePolymorphicXml(this TextReader textReader, params Type[] types)
    {
        if (textReader == null || types == null)
            throw new ArgumentNullException();
        var settings = new XmlReaderSettings { CloseInput = false }; // Let caller close the input.
        using (var xmlReader = XmlReader.Create(textReader, settings))
        {
            foreach (var type in types)
            {
                var serializer = new XmlSerializer(type);
                if (serializer.CanDeserialize(xmlReader))
                    return serializer.Deserialize(xmlReader);
            }
        }
        throw new XmlException("Invalid root type.");
    }
}

Затем используйте его следующим образом:

var xmlBody = result.ResponseBody.DeserializePolymorphicXml(typeof(SuccessResponse), typeof(FailResponse));
if (xmlBody is SuccessResponse)
{
    // Handle successful response
}
else if (xmlBody is FailResponse)
{
    // Handle failed response
}
else
{
    // unknown response
    throw new InvalidOperationException("unknown response");
}

Пример скрипт .

2
ответ дан dbc 16 August 2018 в 11:47
поделиться
  • 1
    Это выглядит фантастически! Я буду реализовывать это сегодня и посмотреть, как это происходит. Благодаря! – Lock 29 May 2017 в 22:24
  • 2
    Просто реализовано это, и оно работает очень хорошо. Мой код намного чище. Я думаю, что нет необходимости в другом примере использования выше, поскольку десериализатор будет генерировать исключение, если тип неизвестен в любом случае. Благодаря! – Lock 29 May 2017 в 23:48
Другие вопросы по тегам:

Похожие вопросы: