1

我在一个作业上玩即兴界面并遇到以下问题

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

该问题被标记为“不会修复”,并且在评论中作者说可以通过实现自定义即兴对象来修复它。

有人有这种实现的样本吗?或者知道这个问题的另一种解决方案?

4

1 回答 1

2

所以问题在于将JArrayGetEnumerator() 定义为仅接口,这使得该方法不再可以被 DLR 调用。所以在下面我覆盖了trygetmember检查结果是否为 aJArray并将其转换为以JEnumerabledlr 可调用方式实现 GetEnumerator() 的 a 。

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

但是,这仅适用于没有超过一个属性深度的数组的 json 结构。您可以修改上述内容以递归检查任何可能使用代理返回的任何内容,或者修改字典索引器set以在反序列化时检查和转换。


更新: Json.net verion >= 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 回答