CodeDomLoader.cs source code in C# .NET

Source code for the .NET framework in C#

                        

Code:

/ 4.0 / 4.0 / untmp / DEVDIV_TFS / Dev10 / Releases / RTMRel / ndp / cdf / src / WF / Common / AuthoringOM / Compiler / TypeSystem / CodeDomLoader.cs / 1305376 / CodeDomLoader.cs

                            namespace System.Workflow.ComponentModel.Compiler 
{
 	using System;
	using System.CodeDom;
	using System.Collections; 
	using System.Collections.Generic;
 	using System.Reflection; 
	using System.Diagnostics; 

 	internal class CodeDomLoader: IDisposable 
 	{
		private TypeProvider typeProvider = null;
 		private CodeCompileUnit codeCompileUnit = null;
		private List types = new List(); 

		internal CodeDomLoader(TypeProvider typeProvider, CodeCompileUnit codeCompileUnit) 
		{ 
 			this.typeProvider = typeProvider;
			this.codeCompileUnit = codeCompileUnit; 
 			AddTypes();
 		}

		internal void Refresh(EventHandler refresher) 
 		{
			RemoveTypes(); 
			refresher(this.typeProvider, EventArgs.Empty); 
			AddTypes();
 		} 

		private void AddTypes()
 		{
 			if (this.typeProvider != null && this.types != null) 
			{
 				this.types.Clear(); 
				foreach (CodeNamespace codeNamespace in this.codeCompileUnit.Namespaces) 
				{
					foreach (CodeTypeDeclaration codeTypeDeclaration in codeNamespace.Types) 
 					{
						// Look for partial type 						
 						string typename = Helper.EnsureTypeName(codeTypeDeclaration.Name);
 
 						if(codeNamespace.Name.Length > 0)
							typename = (Helper.EnsureTypeName(codeNamespace.Name) + "." + typename); 
 
                        DesignTimeType partialType = this.typeProvider.GetType(typename, false) as DesignTimeType;
                        if ( partialType == null ) 
                        {
                            partialType = new DesignTimeType(null, codeTypeDeclaration.Name, codeNamespace.Imports, codeNamespace.Name, this.typeProvider);
                            this.types.Add(partialType);
                            this.typeProvider.AddType(partialType); 
                        }
                        partialType.AddCodeTypeDeclaration(codeTypeDeclaration); 
                    } 
 				}
 
				Queue nestedQueue = new Queue(this.types);
				while (nestedQueue.Count != 0)
				{
 					Type type = nestedQueue.Dequeue() as Type; 
					if(type.DeclaringType != null)
 						this.types.Add(type); 
 					foreach (Type nestedType2 in type.GetNestedTypes(BindingFlags.Instance | BindingFlags.Static | BindingFlags.Public | BindingFlags.NonPublic)) 
						nestedQueue.Enqueue(nestedType2);
 				} 
			}
		}
		
 		private void RemoveTypes() 
		{
 			if (this.typeProvider != null && this.types != null) 
 			{ 
				this.typeProvider.RemoveTypes(this.types.ToArray());
 				this.types.Clear(); 
			}
		}

		#region IDisposable Members 

 		public void Dispose() 
		{ 
 			RemoveTypes();
 			this.typeProvider = null; 
			this.types = null;
 		}

		#endregion 
	}
} 

// 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