Minor fixes around OnModuleBuilding (#1116)
* Don't attempt instantiation of an abstract module * Attempt associating a TypeReader in case one is registered late (ie. OnModuleBuilding)
This commit is contained in:
@@ -120,7 +120,7 @@ namespace Discord.Commands.Builders
|
||||
if (Name == null)
|
||||
Name = _aliases[0];
|
||||
|
||||
if (TypeInfo != null)
|
||||
if (TypeInfo != null && !TypeInfo.IsAbstract)
|
||||
{
|
||||
var moduleInstance = ReflectionUtils.CreateObject<IModuleBase>(TypeInfo, service, services);
|
||||
moduleInstance.OnModuleBuilding(service, this);
|
||||
|
||||
@@ -45,14 +45,7 @@ namespace Discord.Commands.Builders
|
||||
|
||||
internal void SetType(Type type)
|
||||
{
|
||||
var readers = Command.Module.Service.GetTypeReaders(type);
|
||||
if (readers != null)
|
||||
TypeReader = readers.FirstOrDefault().Value;
|
||||
else
|
||||
TypeReader = Command.Module.Service.GetDefaultTypeReader(type);
|
||||
|
||||
if (TypeReader == null)
|
||||
throw new InvalidOperationException($"{type} does not have a TypeReader registered for it. Parameter: {Name} in {Command.PrimaryAlias}");
|
||||
TypeReader = GetReader(type);
|
||||
|
||||
if (type.GetTypeInfo().IsValueType)
|
||||
DefaultValue = Activator.CreateInstance(type);
|
||||
@@ -60,7 +53,16 @@ namespace Discord.Commands.Builders
|
||||
type = ParameterType.GetElementType();
|
||||
ParameterType = type;
|
||||
}
|
||||
|
||||
|
||||
private TypeReader GetReader(Type type)
|
||||
{
|
||||
var readers = Command.Module.Service.GetTypeReaders(type);
|
||||
if (readers != null)
|
||||
return readers.FirstOrDefault().Value;
|
||||
else
|
||||
return Command.Module.Service.GetDefaultTypeReader(type);
|
||||
}
|
||||
|
||||
public ParameterBuilder WithSummary(string summary)
|
||||
{
|
||||
Summary = summary;
|
||||
@@ -100,10 +102,10 @@ namespace Discord.Commands.Builders
|
||||
|
||||
internal ParameterInfo Build(CommandInfo info)
|
||||
{
|
||||
if (TypeReader == null)
|
||||
if ((TypeReader ?? (TypeReader = GetReader(ParameterType))) == null)
|
||||
throw new InvalidOperationException($"No type reader found for type {ParameterType.Name}, one must be specified");
|
||||
|
||||
return new ParameterInfo(this, info, Command.Module.Service);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user