/// <summary> /// Resolves the supplied generic <paramref name="typeName"/>, /// substituting recursively all its type parameters., /// to a <see cref="System.Type"/> instance. /// </summary> /// <param name="typeName"> /// The (possibly generic) name of a <see cref="System.Type"/>. /// </param> /// <returns> /// A resolved <see cref="System.Type"/> instance. /// </returns> /// <exception cref="System.TypeLoadException"> /// If the supplied <paramref name="typeName"/> could not be resolved /// to a <see cref="System.Type"/>. /// </exception> private Type ResolveGenericType(string typeName) { #region Sanity Check if (typeName == null || typeName.Trim().Length == 0) { throw BuildTypeLoadException(typeName); } #endregion if (typeName.StartsWith(NULLABLE_TYPE)) { return(null); } else { GenericArgumentsInfo genericInfo = new GenericArgumentsInfo(typeName); Type type = null; try { if (genericInfo.ContainsGenericArguments) { type = TypeUtils.ResolveType(genericInfo.GenericTypeName); if (!genericInfo.IsGenericDefinition) { string[] unresolvedGenericArgs = genericInfo.GetGenericArguments(); Type[] genericArgs = new Type[unresolvedGenericArgs.Length]; for (int i = 0; i < unresolvedGenericArgs.Length; i++) { genericArgs[i] = TypeUtils.ResolveType(unresolvedGenericArgs[i]); } type = type.MakeGenericType(genericArgs); } } } catch (Exception ex) { if (ex is TypeLoadException) { throw; } throw BuildTypeLoadException(typeName, ex); } return(type); } }
private Type ResolveGenericType(string typeName) { if ((typeName == null) || (typeName.Trim().Length == 0)) { throw BuildTypeLoadException(typeName); } if (typeName.StartsWith("System.Nullable")) { return(null); } GenericArgumentsInfo info = new GenericArgumentsInfo(typeName); Type type = null; try { if (!info.ContainsGenericArguments) { return(type); } type = TypeUtils.ResolveType(info.GenericTypeName); if (info.IsGenericDefinition) { return(type); } string[] genericArguments = info.GetGenericArguments(); Type[] typeArguments = new Type[genericArguments.Length]; for (int i = 0; i < genericArguments.Length; i++) { typeArguments[i] = TypeUtils.ResolveType(genericArguments[i]); } type = type.MakeGenericType(typeArguments); } catch (Exception exception) { if (exception is TypeLoadException) { throw; } throw BuildTypeLoadException(typeName, exception); } return(type); }
/// <summary> /// Resolves the supplied generic <paramref name="typeName"/>, /// substituting recursively all its type parameters., /// to a <see cref="System.Type"/> instance. /// </summary> /// <param name="typeName"> /// The (possibly generic) name of a <see cref="System.Type"/>. /// </param> /// <returns> /// A resolved <see cref="System.Type"/> instance. /// </returns> /// <exception cref="System.TypeLoadException"> /// If the supplied <paramref name="typeName"/> could not be resolved /// to a <see cref="System.Type"/>. /// </exception> private static Type ResolveGenericType(string typeName) { Contract.Require.That(typeName, Is.Not.Null & Is.Not.Empty).When("retrieving argument typeName for ResolveType method"); if (typeName.StartsWith(NULLABLE_TYPE))//如果有NullAble类型开始 { return(null); } GenericArgumentsInfo genericInfo = new GenericArgumentsInfo(typeName); Type type = null; try { if (genericInfo.ContainsGenericArguments) { type = TypeUtils.ResolveType(genericInfo.GenericTypeName);//此处可能会有递归的调用 if (!genericInfo.IsGenericDefinition) { string[] unresolvedGenericArgs = genericInfo.GetGenericArguments(); Type[] genericArgs = new Type[unresolvedGenericArgs.Length]; for (int i = 0; i < unresolvedGenericArgs.Length; i++) { genericArgs[i] = TypeUtils.ResolveType(unresolvedGenericArgs[i]);//对每一个参数进行类型判断分析 } //替代由当前泛型类型定义的类型参数组成的类型数组的元素 type = type.MakeGenericType(genericArgs); } } } catch (Exception ex) { if (ex is TypeLoadException) { throw; } throw BuildTypeLoadException(typeName, ex); } return(type); }
/// <summary> /// Resolves the supplied generic <paramref name="typeName"/>, /// substituting recursively all its type parameters., /// to a <see cref="System.Type"/> instance. /// </summary> /// <param name="typeName"> /// The (possibly generic) name of a <see cref="System.Type"/>. /// </param> /// <returns> /// A resolved <see cref="System.Type"/> instance. /// </returns> /// <exception cref="System.TypeLoadException"> /// If the supplied <paramref name="typeName"/> could not be resolved /// to a <see cref="System.Type"/>. /// </exception> private Type ResolveGenericType(string typeName) { if (string.IsNullOrEmpty(typeName)) { throw BuildTypeLoadException(typeName); } GenericArgumentsInfo genericInfo = new GenericArgumentsInfo(typeName); Type type = null; try { if (genericInfo.ContainsGenericArguments) { type = ObjectUtils.ResolveType(genericInfo.GenericTypeName); if (!genericInfo.IsGenericDefinition) { string[] unresolvedGenericArgs = genericInfo.GetGenericArguments( ); Type[] genericArgs = new Type[unresolvedGenericArgs.Length]; for (int i = 0; i < unresolvedGenericArgs.Length; i++) { genericArgs[i] = ObjectUtils.ResolveType(unresolvedGenericArgs[i]); } type = type.MakeGenericType(genericArgs); } } } catch (Exception ex) { if (ex is TypeLoadException) { throw; } throw BuildTypeLoadException(typeName, ex); } return(type); }
/// <summary> /// Resolves the supplied generic <paramref name="typeName"/>, /// substituting recursively all its type parameters., /// to a <see cref="System.Type"/> instance. /// </summary> /// <param name="typeName"> /// The (possibly generic) name of a <see cref="System.Type"/>. /// </param> /// <returns> /// A resolved <see cref="System.Type"/> instance. /// </returns> /// <exception cref="System.TypeLoadException"> /// If the supplied <paramref name="typeName"/> could not be resolved /// to a <see cref="System.Type"/>. /// </exception> private Type ResolveGenericType(string typeName) { #region Sanity Check if (typeName == null || typeName.Trim().Length==0) { throw BuildTypeLoadException(typeName); } #endregion if (typeName.StartsWith(NULLABLE_TYPE)) { return null; } else { GenericArgumentsInfo genericInfo = new GenericArgumentsInfo(typeName); Type type = null; try { if (genericInfo.ContainsGenericArguments) { type = TypeUtils.ResolveType(genericInfo.GenericTypeName); if (!genericInfo.IsGenericDefinition) { string[] unresolvedGenericArgs = genericInfo.GetGenericArguments(); Type[] genericArgs = new Type[unresolvedGenericArgs.Length]; for (int i = 0; i < unresolvedGenericArgs.Length; i++) { genericArgs[i] = TypeUtils.ResolveType(unresolvedGenericArgs[i]); } type = type.MakeGenericType(genericArgs); } } } catch (Exception ex) { if (ex is TypeLoadException) { throw; } throw BuildTypeLoadException(typeName, ex); } return type; } }
/// <summary> /// Resolves the supplied generic <paramref name="typeName"/>, /// substituting recursively all its type parameters., /// to a <see cref="System.Type"/> instance. /// </summary> /// <param name="typeName"> /// The (possibly generic) name of a <see cref="System.Type"/>. /// </param> /// <returns> /// A resolved <see cref="System.Type"/> instance. /// </returns> /// <exception cref="System.TypeLoadException"> /// If the supplied <paramref name="typeName"/> could not be resolved /// to a <see cref="System.Type"/>. /// </exception> private static Type ResolveGenericType(string typeName) { Contract.Require.That(typeName, Is.Not.Null & Is.Not.Empty).When("retrieving argument typeName for ResolveType method"); if (typeName.StartsWith(NULLABLE_TYPE)) { return null; } GenericArgumentsInfo genericInfo = new GenericArgumentsInfo(typeName); Type type = null; try { if (genericInfo.ContainsGenericArguments) { type = TypeUtils.ResolveType(genericInfo.GenericTypeName); if (!genericInfo.IsGenericDefinition) { string[] unresolvedGenericArgs = genericInfo.GetGenericArguments(); Type[] genericArgs = new Type[unresolvedGenericArgs.Length]; for (int i = 0; i < unresolvedGenericArgs.Length; i++) { genericArgs[i] = TypeUtils.ResolveType(unresolvedGenericArgs[i]); } type = type.MakeGenericType(genericArgs); } } } catch (Exception ex) { if (ex is TypeLoadException) { throw; } throw BuildTypeLoadException(typeName, ex); } return type; }