Достъп до обекти, върнати от 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