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); } } }
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); }
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(); } }