是否可以将.NET对象暴露给JavaScript,该JavaScript具有返回IEnumerable的方法?

时间:2017-09-04 14:38:39

标签: javascript c# .net jurassic

我正在尝试创建一个将通过Jurassic JavaScript引擎公开的.NET类。该类表示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属性中。两种变化都没有区别,我仍然看到同样的例外。

有没有办法从暴露给JavaScript的.NET类中的方法返回IEnumerable?

1 个答案:

答案 0 :(得分:0)

侏罗纪的维护者Paul Bartrum在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());
}