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())

しかし、その後どこに進むべきかわかりません(Googleからの回答はどれもこの状況に適合していないようで、ほとんどが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<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 に答える