/// <summary> /// Gets an <see cref="ObjectType"/> matching the given fully /// qualified CLR class name and assembly loader. /// </summary> /// <param name="metadataProvider"> /// </param> /// <param name="fullName"> /// Fully qualified name of the CLR class. /// </param> /// <param name="assemblyLoader"> /// Assembly loader used to get available assemblies in /// which to search for the class. /// </param> /// <returns> /// Returns an instance of <see cref="ObjectType"/> for /// the specified CLR class. /// </returns> internal static ObjectType Get(IMetadataProvider metadataProvider, string fullName, IAssemblyLoader assemblyLoader) { if (string.IsNullOrEmpty(fullName)) { throw new ArgumentNullException("fullName"); } if (assemblyLoader == null) { //assemblyLoader = new DefaultAssemblyLoader(); throw new ArgumentNullException("assemblyLoader"); } if (classCache.ContainsKey(fullName)) { return(classCache[fullName]); } // Check to see if this is base object if (fullName.Equals(nameof(System.Object))) { return(RootObjectType); } // Performance optimization! Give preferential treatment to the Abp.Runtime // assembly since it is hit frequently. var objType = LoadObjectTypeFromAssembly(metadataProvider, typeof(ObjectType).Assembly, fullName); if (objType != null) { if (!classCache.ContainsKey(fullName)) { classCache.Add(fullName, objType); } return(objType); } // Now search through all available assemblies using the given assembly loader foreach (var curAssembly in assemblyLoader.GetAllAssemblies()) { // Skip Abp.Runtime assembly since we already looked there if (curAssembly != typeof(ObjectType).Assembly) { objType = LoadObjectTypeFromAssembly(metadataProvider, curAssembly, fullName); if (objType != null) { if (!classCache.ContainsKey(fullName)) { classCache.Add(fullName, objType); } return(objType); } } } return(null); }