2017-09-04 1 views
1

쥬라기 자바 스크립트 엔진을 통해 자바 스크립트에 노출되는 .NET 클래스를 만들려고합니다. 클래스는 HTTP 응답 객체를 나타냅니다. HTTP 응답에는 동일한 이름을 가진 여러 헤더가있을 수 있으므로 특정 이름의 헤더를 IEnumerable로 반환하는 메서드를 포함하고 싶습니다. Unsupported type: System.Collections.Generic.IList'1[System.String]IEnumerable을 반환하는 메서드가있는 JavaScript에 .NET 객체를 노출 할 수 있습니까?

내가가 IList의에서 대해 getHeaders 메서드의 반환 형식을 변경 시도했다 :

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를 얻을 :

내가 지금까지 무엇을 가지고 string []을 추가하고 옵션 인 IsEnumerable 속성을 메서드를 장식하는 JSFunction 특성에 추가합니다. 두 변화 모두 변화를 가져 오지 않았지만 여전히 동일한 예외가 발생했습니다.

JavaScript에 노출 된 .NET 클래스의 메서드에서 IEnumerable을 반환하는 방법이 있습니까?

답변

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()); 
}