void StoreAppropriatelyTypedValue (object obj, object keyObj)
{
var ms = CurrentMemberState; // note that this retrieves parent's current property for EndObject.
if (ms != null) {
var state = object_states.Peek ();
var parent = state.Value;
var xt = state.Type;
var xm = ms.Member;
if (xm == XamlLanguage.Initialization) {
state.Value = GetCorrectlyTypedValue (xt, obj);
state.IsInstantiated = true;
} else if (xm.IsEvent) {
ms.Value = (string) obj; // save name of value delegate (method).
state.IsInstantiated = true;
} else if (xm.Type.IsXData) {
var xdata = (XData) obj;
var ixser = xm.Invoker.GetValue (state.Value) as IXmlSerializable;
if (ixser != null)
ixser.ReadXml ((XmlReader) xdata.XmlReader);
}
else if (xm == XamlLanguage.Base)
ms.Value = GetCorrectlyTypedValue (xm.Type, obj);
else if (xm == XamlLanguage.Name || xm == xt.GetAliasedProperty (XamlLanguage.Name))
ms.Value = GetCorrectlyTypedValue (XamlLanguage.String, obj);
else if (xm == XamlLanguage.Key)
state.KeyValue = GetCorrectlyTypedValue (xt.KeyType, obj);
else {
if (!AddToCollectionIfAppropriate (xt, xm, parent, obj, keyObj)) {
if (!xm.IsReadOnly)
ms.Value = GetCorrectlyTypedValue (xm.Type, obj);
}
}
}
}