【发布时间】:2013-04-08 07:03:52
【问题描述】:
我在一个作业上玩即兴界面并遇到以下问题
https://code.google.com/p/impromptu-interface/issues/detail?id=17
该问题被标记为“无法修复”,并且在 cmets 中作者说可以通过实现自定义即兴对象来修复它。
有人有这样的实现示例吗?或者知道这个问题的另一种解决方案?
【问题讨论】:
标签: json.net impromptu-interface
我在一个作业上玩即兴界面并遇到以下问题
https://code.google.com/p/impromptu-interface/issues/detail?id=17
该问题被标记为“无法修复”,并且在 cmets 中作者说可以通过实现自定义即兴对象来修复它。
有人有这样的实现示例吗?或者知道这个问题的另一种解决方案?
【问题讨论】:
标签: json.net impromptu-interface
所以问题在于JArray 将 GetEnumerator() 定义为仅接口,这使得 DLR 不再可以调用该方法。所以下面我覆盖了trygetmember 来检查结果是否是JArray,并将其转换为以dlr 可调用方式实现GetEnumerator() 的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;
}
}
但是,这仅适用于没有超过一个属性深度的数组的 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; }
}
【讨论】: