1

I have a project that i am running .NET code inside. i need to use the existing objects and cannot modify them.

The class in c# that i am trying to use is

class Fields
{
   Hashtable list = new Hashtable();
   public Fields this[string Name]
   {
      get{
blah blah
      }
   }
}

I am attaching the object to JS window :

window = await _browser.MainFrame.ExecuteJavaScript<IJsObject>("window");
window.Properties["Data"] = _myObject;

when using this in the js environment, i can access everything i need to except i cannot use the getter of the Fields.

window.Data.Fields['123']

Is there something i doing wrong or is there a way to use the getter here?

gashach
  • 420
  • 5
  • 12

1 Answers1

1

You can try this approach:

internal class Program
{
    public static void Main()
    {
        using (IEngine engine = EngineFactory.Create())
        {
            using (IBrowser browser = engine.CreateBrowser())
            {
                browser.Size = new Size(700, 500);

                var myObject = new MyObject();
                var window = browser.MainFrame.ExecuteJavaScript<IJsObject>("window").Result;
                window.Properties["Data"] = myObject;

                // 1. For JS, window.Data.Fields['123'] and window.Data.Fields[123] are equivalent.
                // For C# and VB, this is not the case. To be able to handle numeric indices,
                // DotNetBrowser will recognize if the parameter as a numeric index and try to look for
                // the indexer with the integer parameter, which is not present in the Fields class.
                var value = browser.MainFrame
                                            .ExecuteJavaScript("window.Data.Fields['123']")
                                            .Result;
                Console.WriteLine($"\twindow.Data.Fields['123']: {value}");

                // 2. Workaround: use the get_Item() method generated during compilation.
                // It will accept a string as a parameter and return a proper result.
                value = browser.MainFrame
                                .ExecuteJavaScript("window.Data.Fields.get_Item('123')")
                                .Result;
                Console.WriteLine($"\twindow.Data.Fields.get_Item('123'): {value}");

                // 3. The non-numeric index will be recognized as string and the corresponding
                // indexer will be used.
                value = browser.MainFrame
                                    .ExecuteJavaScript("window.Data.Fields['id']")
                                    .Result;
                Console.WriteLine($"\twindow.Data.Fields['id']: {value}");
            }
        }

        Console.WriteLine("Press any key to terminate...");
        Console.ReadKey();
    }
    class Fields
    {
        readonly Hashtable list = new Hashtable();
        public string this[string Name]
        {
            get
            {
                return list[Name]?.ToString();
            }
        }

        public void Add(string key, string value)
        {
            list[key] = value;
        }
    }
    private class MyObject
    {
        public MyObject()
        {
            Fields = new Fields();
            Fields.Add("123", "Test");
            Fields.Add("id", "Test2");
        }

        public Fields Fields { get; }
    }
}