// Token: 0x060021BA RID: 8634 RVA: 0x000A8248 File Offset: 0x000A6448
        internal void CompileAttribute(ArrayList xamlNodes, AttributeData data)
        {
            string fullName  = data.DeclaringType.Assembly.FullName;
            string fullName2 = data.DeclaringType.FullName;
            Type   propertyType;
            bool   propertyCanWrite;

            XamlTypeMapper.GetPropertyType(data.Info, out propertyType, out propertyCanWrite);
            XamlNode value;
            XamlNode value2;

            switch (BamlRecordManager.GetPropertyStartRecordType(propertyType, propertyCanWrite))
            {
            case BamlRecordType.PropertyArrayStart:
                value  = new XamlPropertyArrayStartNode(data.LineNumber, data.LinePosition, data.Depth, data.Info, fullName, fullName2, data.PropertyName);
                value2 = new XamlPropertyArrayEndNode(data.LineNumber, data.LinePosition, data.Depth);
                goto IL_164;

            case BamlRecordType.PropertyIListStart:
                value  = new XamlPropertyIListStartNode(data.LineNumber, data.LinePosition, data.Depth, data.Info, fullName, fullName2, data.PropertyName);
                value2 = new XamlPropertyIListEndNode(data.LineNumber, data.LinePosition, data.Depth);
                goto IL_164;

            case BamlRecordType.PropertyIDictionaryStart:
                value  = new XamlPropertyIDictionaryStartNode(data.LineNumber, data.LinePosition, data.Depth, data.Info, fullName, fullName2, data.PropertyName);
                value2 = new XamlPropertyIDictionaryEndNode(data.LineNumber, data.LinePosition, data.Depth);
                goto IL_164;
            }
            value  = new XamlPropertyComplexStartNode(data.LineNumber, data.LinePosition, data.Depth, data.Info, fullName, fullName2, data.PropertyName);
            value2 = new XamlPropertyComplexEndNode(data.LineNumber, data.LinePosition, data.Depth);
IL_164:
            xamlNodes.Add(value);
            this.CompileAttributeCore(xamlNodes, data);
            xamlNodes.Add(value2);
        }
Exemplo n.º 2
0
        // Token: 0x06001EC8 RID: 7880 RVA: 0x00093B7C File Offset: 0x00091D7C
        internal static BamlRecordType GetPropertyStartRecordType(Type propertyType, bool propertyCanWrite)
        {
            BamlRecordType result;

            if (propertyType.IsArray)
            {
                result = BamlRecordType.PropertyArrayStart;
            }
            else if (typeof(IDictionary).IsAssignableFrom(propertyType))
            {
                result = BamlRecordType.PropertyIDictionaryStart;
            }
            else if (typeof(IList).IsAssignableFrom(propertyType) || BamlRecordManager.TreatAsIAddChild(propertyType) || (typeof(IEnumerable).IsAssignableFrom(propertyType) && !propertyCanWrite))
            {
                result = BamlRecordType.PropertyIListStart;
            }
            else
            {
                result = BamlRecordType.PropertyComplexStart;
            }
            return(result);
        }
        // Token: 0x060020F0 RID: 8432 RVA: 0x000975CC File Offset: 0x000957CC
        public void WriteStartComplexProperty(string assemblyName, string ownerTypeFullName, string propName)
        {
            this.VerifyWriteState();
            this._parserContext.PushScope();
            this.ProcessMarkupExtensionNodes();
            Type   type             = null;
            bool   propertyCanWrite = true;
            object obj;
            Type   type2;

            this.GetDpOrPi(assemblyName, ownerTypeFullName, propName, out obj, out type2);
            if (obj == null)
            {
                MethodInfo mi = this.GetMi(assemblyName, ownerTypeFullName, propName, out type2);
                if (mi != null)
                {
                    XamlTypeMapper.GetPropertyType(mi, out type, out propertyCanWrite);
                }
            }
            else
            {
                type = XamlTypeMapper.GetPropertyType(obj);
                PropertyInfo propertyInfo = obj as PropertyInfo;
                if (propertyInfo != null)
                {
                    propertyCanWrite = propertyInfo.CanWrite;
                }
                else
                {
                    DependencyProperty dependencyProperty = obj as DependencyProperty;
                    if (dependencyProperty != null)
                    {
                        propertyCanWrite = !dependencyProperty.ReadOnly;
                    }
                }
            }
            int depth;

            if (type == null)
            {
                this.Push(BamlRecordType.PropertyComplexStart);
                int lineNumber   = 0;
                int linePosition = 0;
                depth       = this._depth;
                this._depth = depth + 1;
                XamlPropertyComplexStartNode xamlComplexPropertyNode = new XamlPropertyComplexStartNode(lineNumber, linePosition, depth, null, assemblyName, ownerTypeFullName, propName);
                this._bamlRecordWriter.WritePropertyComplexStart(xamlComplexPropertyNode);
                return;
            }
            BamlRecordType propertyStartRecordType = BamlRecordManager.GetPropertyStartRecordType(type, propertyCanWrite);

            this.Push(propertyStartRecordType);
            switch (propertyStartRecordType)
            {
            case BamlRecordType.PropertyArrayStart:
            {
                int lineNumber2   = 0;
                int linePosition2 = 0;
                depth       = this._depth;
                this._depth = depth + 1;
                XamlPropertyArrayStartNode xamlPropertyArrayStartNode = new XamlPropertyArrayStartNode(lineNumber2, linePosition2, depth, obj, assemblyName, ownerTypeFullName, propName);
                this._bamlRecordWriter.WritePropertyArrayStart(xamlPropertyArrayStartNode);
                return;
            }

            case BamlRecordType.PropertyIListStart:
            {
                int lineNumber3   = 0;
                int linePosition3 = 0;
                depth       = this._depth;
                this._depth = depth + 1;
                XamlPropertyIListStartNode xamlPropertyIListStart = new XamlPropertyIListStartNode(lineNumber3, linePosition3, depth, obj, assemblyName, ownerTypeFullName, propName);
                this._bamlRecordWriter.WritePropertyIListStart(xamlPropertyIListStart);
                return;
            }

            case BamlRecordType.PropertyIDictionaryStart:
            {
                int lineNumber4   = 0;
                int linePosition4 = 0;
                depth       = this._depth;
                this._depth = depth + 1;
                XamlPropertyIDictionaryStartNode xamlPropertyIDictionaryStartNode = new XamlPropertyIDictionaryStartNode(lineNumber4, linePosition4, depth, obj, assemblyName, ownerTypeFullName, propName);
                this._bamlRecordWriter.WritePropertyIDictionaryStart(xamlPropertyIDictionaryStartNode);
                return;
            }
            }
            int lineNumber5   = 0;
            int linePosition5 = 0;

            depth       = this._depth;
            this._depth = depth + 1;
            XamlPropertyComplexStartNode xamlComplexPropertyNode2 = new XamlPropertyComplexStartNode(lineNumber5, linePosition5, depth, obj, assemblyName, ownerTypeFullName, propName);

            this._bamlRecordWriter.WritePropertyComplexStart(xamlComplexPropertyNode2);
        }