0

新年快乐 :-)

我有以下 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[]' ...

任何进一步的想法

谢谢

4

2 回答 2

1

前段时间我遇到了类似的问题。我不得不像这样以特殊的方式对待非原始类型:

if (t.IsGenericType && t.GetGenericTypeDefinition().Equals(typeof(List<>)))
{
    Type u = t.GetGenericArguments()[0];
    if (u.Equals(typeof(int)))
       // now dealing with List<int>
...
}

希望这个简短的片段有所帮助。

更新更新:

if (localListType.Equals(typeof(int)))
{
    object[] dataItem = (object[])dataModel[propInfo.Name];
    List<int>tempList = new List<int>();
    foreach(object probablyInteger in dataItem)
        tempList.Add(Convert.ToInt32(probablyInteger));
    propInfo.SetValue(perinatalModel, tempList,  null);
}
于 2013-01-01T14:03:35.367 回答
0

您可以尝试使用以下代码

public List<int> AttemptedDeliveryModesIDList { get; set; }

public int[] AttemptedDeliveryModesIDList { get; set; }

我还没有尝试过代码。所以我不是 100% 确定

于 2013-01-01T13:52:37.790 回答