/// <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)); }