Можно ли представить объект.NET для JavaScript, у которого есть метод, возвращающий IEnumerable?
Я пытаюсь создать класс.NET, который будет работать с JavaScript через движок Jurassic JavaScript. Класс представляет объект ответа HTTP. Поскольку ответ HTTP может иметь несколько заголовков с одним и тем же именем, я хотел бы включить метод, который возвращает IEnumerable заголовков с определенным именем.
Это то, что я до сих пор:
public class JsResponseInstance : ObjectInstance
{
private IDictionary<string, IList<string>> _headers;
public JsResponseInstance(ObjectInstance prototype)
: base(prototype)
{
this.PopulateFunctions();
_headers = new Dictionary<string, IList<string>>();
}
[JSFunction(Name = "addHeader")]
public virtual void addHeader(string name, string value)
{
IList<string> vals;
bool exists = _headers.TryGetValue(name, out vals);
if (!exists)
{
vals = new List<string>();
_headers[name] = vals;
}
vals.Add(value);
}
[JSFunction(Name = "getHeaders")]
public virtual IList<string> getHeaders(string name)
{
IList<string> vals;
bool exists = _headers.TryGetValue(name, out vals);
if (!exists)
{
return new List<string>();
}
return vals;
}
}
Когда я тестирую метод getHeaders, я получаю исключение JavascriptException: Unsupported type: System.Collections.Generic.IList'1[System.String]
Я попытался изменить тип возвращаемого значения метода getHeaders с IList на string[], а также добавить необязательное свойство IsEnumerable в атрибут JSFunction, украшающий метод. Ни одно изменение не имело значения, я все еще видел то же исключение.
Есть ли способ вернуть IEnumerable из метода в классе.NET, который доступен для JavaScript?
1 ответ
Пол Бартрум, опекун юрского периода, ответил на этот вопрос на GitHub.
Он заявил, что метод должен возвращать тип, полученный из ObjectInstance. Поскольку нам нужен перечислимый тип, этот возвращаемый тип должен быть ArrayInstance.
Последний рабочий код.NET:
[JSFunction(Name = "getHeaders")]
public virtual ArrayInstance getHeaders(string name)
{
IList<string> vals;
bool exists = _headers.TryGetValue(name, out vals);
if (!exists)
{
return this.Engine.Array.New();
}
return this.Engine.Array.New(vals.ToArray());
}