void StoreAppropriatelyTypedValue(ObjectState state, MemberAndValue ms, object obj, object keyObj)
        {
            var parent = state.Value;
            var xt     = state.Type;
            var xm     = ms.Member;

            if (ReferenceEquals(xm, XamlLanguage.Initialization))
            {
                state.Value          = GetCorrectlyTypedValue(null, xt, obj);
                state.IsInstantiated = true;
            }
            else if (xm.Type.IsXData)
            {
                var xdata = (XData)obj;
#if NETSTANDARD1_0
                var ixser = xm.Invoker.GetValue(state.Value);

                if (ixser != null && (ReflectionHelpers.IXmlSerializableType?.GetTypeInfo().IsAssignableFrom(ixser.GetType().GetTypeInfo()) ?? false))
                {
                    ReflectionHelpers.IXmlSerializableReadXmlMethod?.Invoke(ixser, new object[] { (XmlReader)xdata.XmlReader });
                }
#else
                var ixser = xm.Invoker.GetValue(state.Value) as IXmlSerializable;
                if (ixser != null)
                {
                    ixser.ReadXml((XmlReader)xdata.XmlReader);
                }
#endif
            }
            else if (ReferenceEquals(xm, XamlLanguage.Base))
            {
                ms.Value = GetCorrectlyTypedValue(null, xm.Type, obj);
            }
            else if (ReferenceEquals(xm, XamlLanguage.Name) || xm == xt.GetAliasedProperty(XamlLanguage.Name))
            {
                ms.Value = GetCorrectlyTypedValue(xm, XamlLanguage.String, obj);
            }
            else if (ReferenceEquals(xm, XamlLanguage.Key) || xm == xt.GetAliasedProperty(XamlLanguage.Key))
            {
                var keyValue = GetCorrectlyTypedValue(null, xt.KeyType, obj);
                state.KeyValue = keyValue;
                ms.Value       = keyValue;
            }
            else
            {
                if (!AddToCollectionIfAppropriate(xt, xm, parent, obj, keyObj))
                {
                    if (!xm.IsReadOnly || xm.IsConstructorArgument)
                    {
                        ms.Value = GetCorrectlyTypedValue(xm, xm.Type, obj);
                    }
                }
            }
        }
Beispiel #2
0
        void StoreAppropriatelyTypedValue(ObjectState state, MemberAndValue ms, object obj, object keyObj)
        {
            var parent = state.Value;
            var xt     = state.Type;
            var xm     = ms.Member;

            if (ReferenceEquals(xm, XamlLanguage.Initialization))
            {
                state.Value          = GetCorrectlyTypedValue(null, xt, obj);
                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 (ReferenceEquals(xm, XamlLanguage.Base))
            {
                ms.Value = GetCorrectlyTypedValue(null, xm.Type, obj);
            }
            else if (ReferenceEquals(xm, XamlLanguage.Name) || xm == xt.GetAliasedProperty(XamlLanguage.Name))
            {
                ms.Value = GetCorrectlyTypedValue(xm, XamlLanguage.String, obj);
            }
            else if (ReferenceEquals(xm, XamlLanguage.Key) || xm == xt.GetAliasedProperty(XamlLanguage.Key))
            {
                var keyValue = GetCorrectlyTypedValue(null, xt.KeyType, obj);
                state.KeyValue = keyValue;
                ms.Value       = keyValue;
            }
            else
            {
                if (!AddToCollectionIfAppropriate(xt, xm, parent, obj, keyObj))
                {
                    if (!xm.IsReadOnly || xm.IsConstructorArgument)
                    {
                        ms.Value = GetCorrectlyTypedValue(xm, xm.Type, obj);
                    }
                }
            }
        }