/// <summary>
        /// Resolves the specified type name.
        /// </summary>
        /// <param name="typeName">Name of the type.</param>
        /// <returns></returns>
        public Type Resolve(string typeName)
        {
            if (string.IsNullOrEmpty(typeName))
            {
                throw new ArgumentException("string typeName should not be null or empty.", "typeName");
            }

            AssembyResolver assemblyResolver = new AssembyResolver();

            Type       resolvedType          = null;
            List <int> arrayDimensionLengths = this.GetArrayDimensions(typeName);

            typeName = this.trimArrayDimensions(typeName);
            if (typeName.Contains("`"))               // Is generic type?
            {
                if (typeName.Contains("]"))           // Is not a generic type definition?
                {
                    int indexBeginTypeArguments = typeName.IndexOf("[");
                    int assemblyNameStartIndex  = this.getMatchingClosingBracketIndex(typeName, indexBeginTypeArguments);
                    if (-1 != typeName.IndexOf(',', assemblyNameStartIndex))
                    {
                        assemblyNameStartIndex = typeName.IndexOf(',', assemblyNameStartIndex) + 1;
                    }
                    string genericTypeDefinition          = typeName.Substring(0, indexBeginTypeArguments).Trim();
                    string qualifiedGenericTypeDefinition = genericTypeDefinition;
                    if (-1 != assemblyNameStartIndex && typeName.Length - 1 != assemblyNameStartIndex)
                    {
                        qualifiedGenericTypeDefinition += string.Format(", {0}", typeName.Substring(assemblyNameStartIndex).Trim());
                    }
                    Type typeDefinition = this.Resolve(qualifiedGenericTypeDefinition);

                    string      typeArguments    = typeName.Substring(indexBeginTypeArguments + 1, this.getMatchingClosingBracketIndex(typeName, indexBeginTypeArguments) - (indexBeginTypeArguments + 1));
                    List <Type> typeArgumentList = new List <Type>();
                    int         i = 0;
                    while (i < typeArguments.Length)
                    {
                        if (',' == typeArguments[i])
                        {
                            i++;
                            continue;
                        }

                        int    indexBeginTypeArgument = typeArguments.IndexOf("[", i);
                        int    indexEndTypeArgument   = this.getMatchingClosingBracketIndex(typeArguments, indexBeginTypeArgument);
                        string typeArgumentName       = typeArguments.Substring(indexBeginTypeArgument + 1, indexEndTypeArgument - (indexBeginTypeArgument + 1));
                        Type   typeArgument           = this.Resolve(typeArgumentName);
                        typeArgumentList.Add(typeArgument);

                        i = indexEndTypeArgument + 1;
                    }

                    resolvedType = typeDefinition.MakeGenericType(typeArgumentList.ToArray());
                    if (null != arrayDimensionLengths)
                    {
                        resolvedType = resolvedType.MakeArrayType(arrayDimensionLengths.Count);
                    }

                    return(resolvedType);
                }
            }

            string typeNamePart               = typeName;
            string assemblyNamePart           = null;
            int    assemblyNamePartStartIndex = typeName.IndexOf(",");;

            if (-1 != assemblyNamePartStartIndex)
            {
                typeNamePart     = typeName.Substring(0, assemblyNamePartStartIndex).Trim();
                assemblyNamePart = typeName.Substring(assemblyNamePartStartIndex + 1).Trim();
            }

            if (!string.IsNullOrEmpty(assemblyNamePart))
            {
                Assembly assembly = assemblyResolver.Resolve(assemblyNamePart);
                resolvedType = assembly.GetType(typeNamePart);
                if (null != arrayDimensionLengths)
                {
                    resolvedType = resolvedType.MakeArrayType(arrayDimensionLengths.Count);
                }

                return(resolvedType);
            }

            // No assembly specified, so look in loaded assemblies.
            foreach (Assembly loadedAssembly in assemblyResolver.GetLoadedAssemblies())
            {
                Type type = loadedAssembly.GetType(typeNamePart);
                if (null != type)
                {
                    resolvedType = type;
                    if (null != arrayDimensionLengths)
                    {
                        resolvedType = resolvedType.MakeArrayType(arrayDimensionLengths.Count);
                    }

                    return(resolvedType);
                }
            }

            // The type is still not found, let the framework resolve the type.
            resolvedType = Type.GetType(typeNamePart);
            if (null != resolvedType)
            {
                if (null != arrayDimensionLengths)
                {
                    resolvedType = resolvedType.MakeArrayType(arrayDimensionLengths.Count);
                }

                return(resolvedType);
            }

            throw new Exception(string.Format("The type '{0}' could not be resolved.", typeName));
        }
		/// <summary>
		/// Resolves the specified type name.
		/// </summary>
		/// <param name="typeName">Name of the type.</param>
		/// <returns></returns>
		public Type Resolve(string typeName)
		{
			if (string.IsNullOrEmpty(typeName))
				throw new ArgumentException("string typeName should not be null or empty.", "typeName");

			AssembyResolver assemblyResolver = new AssembyResolver();

			Type resolvedType = null;
			List<int> arrayDimensionLengths = this.GetArrayDimensions(typeName);
			typeName = this.trimArrayDimensions(typeName);
			if (typeName.Contains("`")) { // Is generic type?
				if (typeName.Contains("]")) { // Is not a generic type definition?
					int indexBeginTypeArguments = typeName.IndexOf("[");
					int assemblyNameStartIndex = this.getMatchingClosingBracketIndex(typeName, indexBeginTypeArguments);
					if (-1 != typeName.IndexOf(',', assemblyNameStartIndex))
						assemblyNameStartIndex = typeName.IndexOf(',', assemblyNameStartIndex) + 1;
					string genericTypeDefinition = typeName.Substring(0, indexBeginTypeArguments).Trim();
					string qualifiedGenericTypeDefinition = genericTypeDefinition;
					if (-1 != assemblyNameStartIndex && typeName.Length-1 != assemblyNameStartIndex )
						qualifiedGenericTypeDefinition += string.Format(", {0}", typeName.Substring(assemblyNameStartIndex).Trim());
					Type typeDefinition = this.Resolve(qualifiedGenericTypeDefinition);
					
					string typeArguments = typeName.Substring(indexBeginTypeArguments + 1, this.getMatchingClosingBracketIndex(typeName, indexBeginTypeArguments) - (indexBeginTypeArguments + 1));
					List<Type> typeArgumentList = new List<Type>();
					int i = 0;
					while (i < typeArguments.Length) {
						if (',' == typeArguments[i]) {
							i++;
							continue;
						}

						int indexBeginTypeArgument = typeArguments.IndexOf("[", i);
						int indexEndTypeArgument = this.getMatchingClosingBracketIndex(typeArguments, indexBeginTypeArgument);
						string typeArgumentName = typeArguments.Substring(indexBeginTypeArgument + 1, indexEndTypeArgument - (indexBeginTypeArgument + 1));
						Type typeArgument = this.Resolve(typeArgumentName);
						typeArgumentList.Add(typeArgument);

						i = indexEndTypeArgument + 1;
					}

					resolvedType = typeDefinition.MakeGenericType(typeArgumentList.ToArray());
					if (null != arrayDimensionLengths)
						resolvedType = resolvedType.MakeArrayType(arrayDimensionLengths.Count);

					return resolvedType;
				}
			}

			string typeNamePart = typeName;
			string assemblyNamePart = null;
			int assemblyNamePartStartIndex = typeName.IndexOf(","); ;
			if (-1 != assemblyNamePartStartIndex) {
				typeNamePart = typeName.Substring(0, assemblyNamePartStartIndex).Trim();
				assemblyNamePart = typeName.Substring(assemblyNamePartStartIndex + 1).Trim();
			}

			if (!string.IsNullOrEmpty(assemblyNamePart)) {
				Assembly assembly = assemblyResolver.Resolve(assemblyNamePart);
				resolvedType = assembly.GetType(typeNamePart);
				if (null != arrayDimensionLengths)
					resolvedType = resolvedType.MakeArrayType(arrayDimensionLengths.Count);

				return resolvedType;
			}

			// No assembly specified, so look in loaded assemblies.
			foreach (Assembly loadedAssembly in assemblyResolver.GetLoadedAssemblies()) {
				Type type = loadedAssembly.GetType(typeNamePart);
				if (null != type) {
					resolvedType = type;
					if (null != arrayDimensionLengths)
						resolvedType = resolvedType.MakeArrayType(arrayDimensionLengths.Count);

					return resolvedType;
				}
			}
	
			// The type is still not found, let the framework resolve the type.
			resolvedType = Type.GetType(typeNamePart);
			if (null != resolvedType) {
				if (null != arrayDimensionLengths)
					resolvedType = resolvedType.MakeArrayType(arrayDimensionLengths.Count);

				return resolvedType;
			}

			throw new Exception(string.Format("The type '{0}' could not be resolved.", typeName));
		}