Esempio n. 1
0
        internal void CreateServicesMembers()
        {
            CodeMethodInvokeExpression callClone;

            CodeExpression[] codeCastExpression;
            string           innerType     = this.InnerType;
            string           clrTypeName   = this.clrTypeInfo.clrtypeName;
            bool             useAutoTyping = (this.clrTypeInfo.IsAbstract ? true : this.clrTypeInfo.IsSubstitutionHead);

            if (this.clrTypeInfo.typeOrigin == SchemaOrigin.Element)
            {
                CodeTypeMember load       = CodeDomHelper.CreateStaticMethod("Load", clrTypeName, innerType, "xmlFile", "System.String", useAutoTyping);
                CodeTypeMember loadReader = CodeDomHelper.CreateStaticMethod("Load", clrTypeName, innerType, "xmlFile", "System.IO.TextReader", useAutoTyping);
                CodeTypeMember parse      = CodeDomHelper.CreateStaticMethod("Parse", clrTypeName, innerType, "xml", "System.String", useAutoTyping);
                if (!this.clrTypeInfo.IsDerived)
                {
                    this.decl.Members.Add(CodeDomHelper.CreateSave("xmlFile", "System.String"));
                    this.decl.Members.Add(CodeDomHelper.CreateSave("tw", "System.IO.TextWriter"));
                    this.decl.Members.Add(CodeDomHelper.CreateSave("xmlWriter", "System.Xml.XmlWriter"));
                }
                else
                {
                    CodeTypeMember attributes = load;
                    attributes.Attributes = attributes.Attributes | MemberAttributes.New;
                    CodeTypeMember codeTypeMember = parse;
                    codeTypeMember.Attributes = codeTypeMember.Attributes | MemberAttributes.New;
                }
                this.decl.Members.Add(load);
                this.decl.Members.Add(loadReader);
                this.decl.Members.Add(parse);
            }
            CodeTypeMember cast = CodeDomHelper.CreateCast(clrTypeName, innerType, useAutoTyping);

            this.decl.Members.Add(cast);
            if (!this.clrTypeInfo.IsAbstract)
            {
                CodeMemberMethod clone = CodeDomHelper.CreateMethod("Clone", MemberAttributes.Override | MemberAttributes.FamilyAndAssembly | MemberAttributes.FamilyOrAssembly | MemberAttributes.Public, new CodeTypeReference("XTypedElement"));
                if (innerType != null)
                {
                    callClone = CodeDomHelper.CreateMethodCall(new CodePropertyReferenceExpression(CodeDomHelper.This(), "Content"), "Clone", new CodeExpression[0]);
                    CodeStatementCollection statements = clone.Statements;
                    codeCastExpression = new CodeExpression[] { new CodeCastExpression(new CodeTypeReference(innerType), callClone) };
                    statements.Add(new CodeMethodReturnStatement(new CodeObjectCreateExpression(clrTypeName, codeCastExpression)));
                }
                else
                {
                    CodeTypeReferenceExpression codeTypeReferenceExpression = new CodeTypeReferenceExpression("XTypedServices");
                    string str = string.Concat("CloneXTypedElement<", clrTypeName, ">");
                    codeCastExpression = new CodeExpression[] { new CodeThisReferenceExpression() };
                    callClone          = CodeDomHelper.CreateMethodCall(codeTypeReferenceExpression, str, codeCastExpression);
                    clone.Statements.Add(new CodeMethodReturnStatement(callClone));
                }
                this.decl.Members.Add(clone);
            }
        }