private unsafe Type ConstructType(Func <AssemblyName, Assembly> assemblyResolver, Func <Assembly, string, bool, Type> typeResolver, bool throwOnError, bool ignoreCase, ref StackCrawlMark stackMark)
{
Assembly assembly = null;
string assemblyName = this.GetAssemblyName();
if (assemblyName.Length > 0)
{
assembly = TypeNameParser.ResolveAssembly(assemblyName, assemblyResolver, throwOnError, ref stackMark);
if (assembly == null)
{
return(null);
}
}
string[] names = this.GetNames();
if (names == null)
{
if (throwOnError)
{
throw new TypeLoadException(Environment.GetResourceString("Arg_TypeLoadNullStr"));
}
return(null);
}
else
{
Type type = TypeNameParser.ResolveType(assembly, names, typeResolver, throwOnError, ignoreCase, ref stackMark);
if (type == null)
{
return(null);
}
SafeTypeNameParserHandle[] typeArguments = this.GetTypeArguments();
Type[] array = null;
if (typeArguments != null)
{
array = new Type[typeArguments.Length];
for (int i = 0; i < typeArguments.Length; i++)
{
using (TypeNameParser typeNameParser = new TypeNameParser(typeArguments[i]))
{
array[i] = typeNameParser.ConstructType(assemblyResolver, typeResolver, throwOnError, ignoreCase, ref stackMark);
}
if (array[i] == null)
{
return(null);
}
}
}
int[] modifiers = this.GetModifiers();
fixed(int *ptr = modifiers)
{
IntPtr pModifiers = new IntPtr((void *)ptr);
return(RuntimeTypeHandle.GetTypeHelper(type, array, pModifiers, (modifiers == null) ? 0 : modifiers.Length));
}
}
}