Можно ли представить объект .NET для JavaScript, у которого есть метод, возвращающий IEnumerable?

1

Я пытаюсь создать класс.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?

Теги:
jurassic

1 ответ

0
Лучший ответ

Пол Бартрум, сопровождающий юрского периода, ответил на этот вопрос в 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());
}

Ещё вопросы

Сообщество Overcoder
Наверх
Меню