C#.NET 4.0の動的オブジェクト(ディクショナリ)で満たされたディクショナリがあります。値が文字列、整数、または浮動小数点数である場合もありますが、値がExpandoObjectである場合もあります。ディクショナリ自体は、実際には、そのプロパティを取得するためにディクショナリにキャストされたExpandoObjectです。
問題は、メインオブジェクトの各プロパティ(したがってディクショナリも)を反復処理していて、ICollection / IList型またはExpandoObject型のオブジェクトがある場合に、アクションを実行したいということです。ただし、問題は、ディクショナリに動的オブジェクト(ExpandoObject)がある場合、それがNullとして表示されることです。
Visual Studio 2010でデバッグしていて、動的ビューを開くと、これらのオブジェクトがプロパティとして一覧表示されますが、同じオブジェクトのプロパティをキーと値のペアとして表示すると(ディクショナリビューから表示すると)、値は「このオブジェクトが他のExpandoObjectsを保持している場合はnull」。そして、NullはCollection / EpandoObjectとしてチェックされないため、私の条件は失敗します。
ExpandoObjectsを使用しているときにこのエラーが発生したことはないので、ExpandoObjectsがnull値として表示される理由について非常に興味があります。
//Function gets a List of ExpandoObjects (casting it as IDictionary)
private static dynamic mergeIdObjects(List<IDictionary<string, dynamic>> objects)
{
// Take first object as placeholder for the other objects
IDictionary<string, dynamic> merged = (objects.First())[ParentObject];
// For all objects to merge (except first one, already used that one as a placeholder)
foreach (var o in objects.Skip(1))
{
IDictionary<string, dynamic> obj = o[ParentObject];
// For all keys(property names) in the object)
foreach (dynamic key in obj.Keys)
{
dynamic oldValue;
// This is where the program doesn't function as it should.
if (merged.TryGetValue(key, out oldValue)) // If key is already in merged object
{
// This never evaluates to True since the IList properties are now 'Null' and they shouldn't!
if (oldValue is IList<dynamic>) // If value is a list
merged[key].Add(obj[key]); // then add item to this list
else
if (merged[key] != obj[key]) // Else create a list and add the item
merged[key] = new List<dynamic> { oldValue, obj[key] };
}
else
merged.Add(key, obj[key]); // If this key is not in the merged object, add it to the merged object
}
}
IDictionary<string, dynamic> placeHolder = new ExpandoObject();
placeHolder.Add(ParentObject, merged);
return (dynamic)placeHolder;
}
欠落しているもの、欠落しているキャスト、または間違ったDataTypeが使用されている可能性がありますか?私はそれを理解することができないようであり、どんな助けも親切に感謝します!