新年快乐 :-)
我有以下 JSON 对象:
{
\"OutcomeSummaryID\":105,
\"DeliveryDetailsID\":9,
\"AttemptedDeliveryModesIDList\":[1,5],
}
我正在使用以下方法对其进行反序列化:
private void SerializeModel<T>(IDictionary<string, object> dataModel, T myModel)
{
Type sourceType = typeof(T);
foreach (PropertyInfo propInfo in (sourceType.GetProperties()))
{
if (dataModel.ContainsKey(propInfo.Name))
{
// if an empty string has been returned don't change the value
if (dataModel[propInfo.Name].ToNullSafeString() != String.Empty)
{
try
{
Type localType = propInfo.PropertyType;
localType = Nullable.GetUnderlyingType(localType) ?? localType;
propInfo.SetValue(myModel, Convert.ChangeType(dataModel[propInfo.Name], localType), null);
}
catch (Exception e)
{
// ToDo: log serialize value errors
}
}
}
}
}
模型定义为:
public class DeliveryDetailsView
{
public int OutcomeSummaryID { get; set; }
public int DeliveryDetailsID { get; set; }
public List<int> AttemptedDeliveryModesIDList { get; set; }
}
当我运行时,会出现以下异常:
System.InvalidCastException was caught
Message=Object must implement IConvertible.
这是一个较大项目的摘录,我在其他地方广泛使用过这种方法,但这是第一次将列表作为字段,我看不出有什么干净的方法可以解决这个问题。我可以使用
if (localType.IsCollectionType())
但不知道在那之后从哪里继续。(谷歌的答案似乎都不适合这种情况,而且大多数都与 XML 有关)。
提前致谢。
更新
感谢下面的@Cube,我现在有了部分答案。
if (localType.IsGenericType && localType.GetGenericTypeDefinition().Equals(typeof(List<>)))
{
Type localListType = localType.GetGenericArguments()[0];
if (localListType.Equals(typeof(int)))
{
IDictionary<string, object> dataItem = (Dictionary<string, object>)dataModel[propInfo.Name];
List<int> tempList = new List<int>();
foreach (var item in dataItem)
{
tempList.Add((int)item.Value);
}
propInfo.SetValue(perinatalModel, tempList, null);
}
}
...但是,所有将 JSON 数组转换为 List 的尝试都失败了。我也尝试过
List<int> tempList = (List<int>)dataModel[propInfo.Name];
两者都抛出异常
Unable to cast object of type 'System.Object[]' ...
任何进一步的想法
谢谢