Итерация по JS объекту, переданному в качестве параметра функции хоста в словарь - PullRequest
0 голосов
/ 18 апреля 2020

Как я могу преобразовать в словарь пар имя и значение из объекта JS, переданного в метод хоста C#? Моя проблема заключается в том, как интерпретировать объекты, полученные в функции exe c. Если бы они были int, я бы просто использовал ...

foreach (int i in args)...

... но они ... что?

Например, в файле JS у меня есть

  myApi.exec("doThang", { dog: "Rover", cat: "Purdy", mouse: "Mini", <non-specific list of more...> } );

В C# У меня есть

public void foo()
{
  var engine = new V8ScriptEngine();
  engine.AddHostObject("myApi", a);  // see below

  // load the above JS
  string script = loadScript();

  // execute that script
  engine.Execute(script);

}

public class a 
{
  public void exec(string name, params object[] args){

  // - how to iterate the args and create say a dictionary of key value pairs? 

  }
}

РЕДАКТИРОВАТЬ: Изменена специфика вопроса сейчас я понимаю, что ключевое слово 'params' не является частью ClearScript.

1 Ответ

1 голос
/ 18 апреля 2020

Вы можете использовать ScriptObject. Объекты сценария могут иметь как индексированные свойства, так и именованные свойства, поэтому вы можете создать два словаря:

public void exec(string name, ScriptObject args) {
    var namedProps = new Dictionary<string, object>();
    foreach (var name in args.PropertyNames) {
        namedProps.Add(name, args[name]);
    }
    var indexedProps = new Dictionary<int, object>();
    foreach (var index in args.PropertyIndices) {
        indexedProps.Add(index, args[index]);
    }
    Console.WriteLine(namedProps.Count);
    Console.WriteLine(indexedProps.Count);
}

Если вы не ожидаете индексированных свойств или не заботитесь о них, вы можете пропустить indexedProps. Или вы можете создать один Dictionary<object, object> экземпляр для хранения обоих.

...