コード例 #1
0
        /// <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);
        }