1

私はジョブジェクトを介して即席のインターフェースで遊んでいて、次の問題に遭遇しました

https://code.google.com/p/impromptu-interface/issues/detail?id=17

この問題は「修正されません」とマークされており、コメントの中で作成者は、カスタムの ImpromptuObject を実装することで修正できると述べています。

そのような実装のサンプルを持っている人はいますか? または、この問題の別の解決策を知っていますか?

4

1 に答える 1

2

したがって、問題はJArrayGetEnumerator() がインターフェイスのみとして定義されているため、メソッドが DLR によって呼び出されなくなります。したがって、以下ではtrygetmember、結果が であるかどうかを確認するために をオーバーライドし、それをdlr 呼び出し可能な方法で GetEnumerator() を実装JArrayする に変換しました。JEnumerable

 public class NonRecursiveJArrayConversionDictionary : ImpromptuDictionary{

    public override bool TryGetMember(GetMemberBinder binder, out object result)
    {
        if(base.TryGetMember(binder, out result)){
          if(result is JArray){
             result = ((JArray)result).AsJEnumerable();
          }
          return true;
        }
        result = null;
        return false;
    }
 }

ただし、これは、1 つ以上のプロパティの深さの配列を持たない json 構造に対してのみ機能します。上記を変更して、おそらくプロキシを使用して何かが返されるたびに再帰的にチェックするか、辞書インデクサーを変更して、set代わりに逆シリアル化されたときにチェックして変換する必要があります。


更新: Json.net バージョン >= 5.0.4.16101 および ImpromptuInterface >= 6.1.4 はそのまま使用できます。

void Main()
{
    ICustomer customer = Impromptu.ActLike(JObject.Parse(@"
        {
            Id: 1,
            Name:'Test',
            Location:'Somewhere',
            Employees: [
                { Id:1, EmployerId:39421, Name:'Joe' },
                { Id:2, EmployerId:39421, Name:'Jane' },
            ]
        }
    "));

    foreach(var employee in customer.Employees){
        employee.Id.Dump();
        employee.Name.Dump();
    }
}


public interface ICustomer
{
    int Id { get; set; }
    string Name { get; set; }
    string Location { get; set; }
    IList<IEmployee> Employees { get; } 
}

public interface IEmployee
{
    int Id { get; set; }
    int EmployerId { get; set; }
    string Name { get; set; }
}
于 2013-04-08T13:38:21.473 に答える