あけましておめでとう :-)
次の 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[]' ...
その他の考え
ありがとう