Доступ к объектам, возвращаемым java-скриптом, запущенным в элементе управления веб-браузера, из C #

Я хотел бы знать, как я могу получить доступ к свойствам объекта, возвращаемого функцией javascript, работающей внутри элемента управления веб-браузером, из C #.

Вот полный контекст:

Я хотел бы создать элемент управления отображением C # на основе библиотеки javascript открытых слоев OpenStreetMap. Карта OSM отображается на веб-странице внутри элемента веб-браузера. Я использую InvokeScript, чтобы управлять картой, вызывая упрощенную оболочку java-скрипта для библиотеки открытых слоев. Все работает нормально.

В оболочке C # я хотел бы реализовать функцию, возвращающую центральные координаты карты, которая в настоящее время отображается в элементе управления веб-браузер. Пока что я придумал только довольно нелегкое решение:

В моей оболочке C # у меня есть две функции, которые мне нужны для запроса центра карты. Сначала у меня есть функция GetCenter, которая использует InvokeScript для вызова функции JavaScript, которая, в свою очередь, вызывает другую функцию C # (SetCenterFromJScript) для установки центра карты в моей оболочке C #:

public Coord GetCenter()
{
  object center = webBrowser.Document.InvokeScript("set_center_in_wrapper");

  // I'm stuck here:
  Type type = center.GetType();
  PropertyInfo[] pi = type.GetProperties();

  // I already get the center as an object, but how can i access the
  // properties "lon" and "lat" directly so that i can get rid of m_center 
  // and SetCenterFromJScript alltogether?

  return m_center;
}

public void SetCenterFromJScript(double lon, double lat)
{
  m_center.lon = lon;
  m_center.lat = lat;
}

Функция сценария Java вызывает C # через механизм ObjectForScripting, как показано здесь:

function set_center_in_wrapper()
{
  var center = map.getCenter().transform(new OpenLayers.Projection("EPSG:900913"), 
                                         new OpenLayers.Projection("EPSG:4326"))

  window.external.SetCenterFromJScript(center.lon, center.lat);
  return center // <- useless at the moment since i don't know how to access the data from C#
}

На данный момент возвращаемое значение бесполезно, я использую SetCenterFromJScript для отправки координат. Как я могу напрямую получить доступ к свойствам «lon» и «lat» центра из C #?

Заранее спасибо, приветствуется любая помощь.


person schroedingers cat    schedule 24.10.2011    source источник


Ответы (1)


Попробуйте использовать InvokeMember, чтобы получить свойства центра. Что-то типа:

 object center = webBrowser.Document.InvokeScript("set_center_in_wrapper");
 Type type = center.GetType();
 Int32 lon = (Int32) type.InvokeMember("lon", 
            BindingFlags.DeclaredOnly | 
            BindingFlags.Public | BindingFlags.NonPublic | 
            BindingFlags.Instance | BindingFlags.GetField, null, center, null);
 Int32 lat = (Int32) type.InvokeMember("lat", 
            BindingFlags.DeclaredOnly | 
            BindingFlags.Public | BindingFlags.NonPublic | 
            BindingFlags.Instance | BindingFlags.GetField, null, center, null);

Раньше я не проверял этот код в этом сценарии, поэтому вам может потребоваться поиграть с флагами привязки.

person Variant    schedule 24.10.2011
comment
Большое Вам спасибо!. Это работает с небольшими изменениями: в моем случае тип двойной, и мне нужно использовать BindingFlags.GetProperty вместо BindingFlag.GetField. - person schroedingers cat; 25.10.2011