Я пытаюсь создать класс.NET, который будет подвергаться JavaScript через Jurassic JavaScript engine. Класс представляет объект ответа 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, я получаю исключение Javascript: Unsupported type: System.Collections.Generic.IList'1[System.String]
Я попытался изменить возвращаемый тип метода getHeaders из IList на строку [], а также добавить необязательное свойство IsEnumerable к атрибуту JSFunction, украшающему этот метод. Ни одно изменение не изменилось, я все еще видел одно и то же исключение.
Есть ли способ вернуть IEnumerable из метода в классе.NET, который подвергается JavaScript?
Пол Бартрум, сопровождающий юрского периода, ответил на этот вопрос в 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());
}