Beispiel #1
0
        private void SearchClass(TypeInfo parentType, object instance, List <Command> commands, string groupPrefix, IDependencyMap dependencyMap, bool appendWhitespace)
        {
            foreach (var method in parentType.DeclaredMethods)
            {
                var cmdAttr = method.GetCustomAttribute <CommandAttribute>();
                if (cmdAttr != null)
                {
                    commands.Add(new Command(method, this, instance, cmdAttr, groupPrefix));
                }
            }
            foreach (var type in parentType.DeclaredNestedTypes)
            {
                var groupAttrib = type.GetCustomAttribute <GroupAttribute>();
                if (groupAttrib != null)
                {
                    string nextGroupPrefix;

                    if (groupPrefix != "")
                    {
                        nextGroupPrefix = groupPrefix + (appendWhitespace ? " " : "") + (groupAttrib.Prefix ?? type.Name.ToLowerInvariant());
                    }
                    else
                    {
                        nextGroupPrefix = groupAttrib.Prefix ?? type.Name.ToLowerInvariant();
                    }
                    SearchClass(type, ReflectionUtils.CreateObject(type, Service, dependencyMap), commands, nextGroupPrefix, dependencyMap, appendWhitespace);
                }
            }
        }
Beispiel #2
0
        private static TypeReader GetTypeReader(CommandService service, Type paramType, Type typeReaderType, IServiceProvider services)
        {
            var        readers = service.GetTypeReaders(paramType);
            TypeReader reader  = null;

            if (readers != null)
            {
                if (readers.TryGetValue(typeReaderType, out reader))
                {
                    return(reader);
                }
            }

            //We dont have a cached type reader, create one
            reader = ReflectionUtils.CreateObject <TypeReader>(typeReaderType.GetTypeInfo(), service, services);
            service.AddTypeReader(paramType, reader);

            return(reader);
        }
Beispiel #3
0
        public async Task <IEnumerable <Module> > LoadAssembly(Assembly assembly, IDependencyMap dependencyMap = null)
        {
            var modules = ImmutableArray.CreateBuilder <Module>();
            await _moduleLock.WaitAsync().ConfigureAwait(false);

            try
            {
                foreach (var type in assembly.ExportedTypes)
                {
                    var typeInfo   = type.GetTypeInfo();
                    var moduleAttr = typeInfo.GetCustomAttribute <ModuleAttribute>();
                    if (moduleAttr != null && moduleAttr.AutoLoad)
                    {
                        var moduleInstance = ReflectionUtils.CreateObject(typeInfo, this, dependencyMap);
                        modules.Add(LoadInternal(moduleInstance, moduleAttr, typeInfo, dependencyMap));
                    }
                }
                return(modules.ToImmutable());
            }
            finally
            {
                _moduleLock.Release();
            }
        }