ContainerCodeDomSerializer.cs source code in C# .NET

Source code for the .NET framework in C#

                        

Code:

/ DotNET / DotNET / 8.0 / untmp / whidbey / REDBITS / ndp / fx / src / Designer / CompMod / System / ComponentModel / Design / Serialization / ContainerCodeDomSerializer.cs / 1 / ContainerCodeDomSerializer.cs

                             
//------------------------------------------------------------------------------
// 
//     Copyright (c) Microsoft Corporation.  All rights reserved.
//  
//-----------------------------------------------------------------------------
 
namespace System.ComponentModel.Design.Serialization { 

    using System; 
    using System.CodeDom;
    using System.Collections;
    using System.ComponentModel;
    using System.ComponentModel.Design; 
    using System.Diagnostics;
    using System.Reflection; 
 
    /// 
    ///    This class is used to serialize things of type "IContainer".  We route all containers 
    ///    to the designer host's container.
    /// 
    internal class ContainerCodeDomSerializer : CodeDomSerializer {
        private const string _containerName = "components"; 
        private static ContainerCodeDomSerializer _defaultSerializer;
 
        ///  
        ///     Retrieves a default static instance of this serializer.
        ///  
        internal new static ContainerCodeDomSerializer Default {
            get {
                if (_defaultSerializer == null) {
                    _defaultSerializer = new ContainerCodeDomSerializer(); 
                }
 
                return _defaultSerializer; 
            }
        } 

        /// 
        ///     We override this so we can always provide the correct container as a reference.
        ///  
        protected override object DeserializeInstance(IDesignerSerializationManager manager, Type type, object[] parameters, string name, bool addToContainer) {
            if (typeof(IContainer).IsAssignableFrom(type)) { 
                object obj = manager.GetService(typeof(IContainer)); 

                if (obj != null) { 
                    Trace("Returning IContainer service as container");
                    manager.SetName(obj, name);
                    return obj;
                } 
            }
 
            Trace("No IContainer service, creating default container."); 
            return base.DeserializeInstance(manager, type, parameters, name, addToContainer);
        } 

        /// 
        ///    Serializes the given object into a CodeDom object.  We serialize an IContainer by
        ///    declaring an IContainer member variable and then assigning a Container into it. 
        /// 
        public override object Serialize(IDesignerSerializationManager manager, object value) { 
 
            // See if there is a type declaration on the stack. If there is, create a field representing
            // the container member variable. 
            CodeTypeDeclaration typeDecl = manager.Context[typeof(CodeTypeDeclaration)] as CodeTypeDeclaration;
            RootContext rootCxt = manager.Context[typeof(RootContext)] as RootContext;
            CodeStatementCollection statements = new CodeStatementCollection();
            CodeExpression lhs; 

            if (typeDecl != null && rootCxt != null) { 
                CodeMemberField field = new CodeMemberField(typeof(IContainer), _containerName); 

                field.Attributes = MemberAttributes.Private; 
                typeDecl.Members.Add(field);
                lhs = new CodeFieldReferenceExpression(rootCxt.Expression, _containerName);
            }
            else { 
                CodeVariableDeclarationStatement var = new CodeVariableDeclarationStatement(typeof(IContainer), _containerName);
 
                statements.Add(var); 
                lhs = new CodeVariableReferenceExpression(_containerName);
            } 

            // Now create the container
            SetExpression(manager, value, lhs);
            CodeObjectCreateExpression objCreate = new CodeObjectCreateExpression(typeof(Container)); 
            CodeAssignStatement assign = new CodeAssignStatement(lhs, objCreate);
 
            assign.UserData["IContainer"] = "IContainer"; 

            statements.Add(assign); 
            return statements;
        }
    }
} 


// File provided for Reference Use Only by Microsoft Corporation (c) 2007.
// Copyright (c) Microsoft Corporation. All rights reserved.


                        

Link Menu

Network programming in C#, Network Programming in VB.NET, Network Programming in .NET
This book is available now!
Buy at Amazon US or
Buy at Amazon UK