CLI: Fix plugin Enum options not working

This commit is contained in:
Katy Coe
2021-01-04 20:30:27 +01:00
parent 688eed7cbf
commit 6ae14eff0b

View File

@@ -86,6 +86,12 @@ namespace Il2CppInspector.CLI
var optionType = option.GetType().GetProperty("Value").PropertyType; var optionType = option.GetType().GetProperty("Value").PropertyType;
var optionValue = option.Value; var optionValue = option.Value;
// Enum types aren't supported by CommandLineParser in dynamic assemblies
if (optionType.IsEnum) {
optionType = typeof(string);
optionValue = optionValue.ToString();
}
// We won't set the Required flag if there is a default option // We won't set the Required flag if there is a default option
var optionEmpty = (optionType.IsValueType && optionValue == Activator.CreateInstance(optionType)) var optionEmpty = (optionType.IsValueType && optionValue == Activator.CreateInstance(optionType))
|| optionValue == null; || optionValue == null;
@@ -97,7 +103,7 @@ namespace Il2CppInspector.CLI
} }
var pluginOptionProperty = CreateAutoProperty(pluginOptionClass, option.Name, optionType); var pluginOptionProperty = CreateAutoProperty(pluginOptionClass, option.Name, optionType);
ConstructorInfo optCtorInfo; ConstructorInfo optCtorInfo;
// Single character // Single character
@@ -191,11 +197,12 @@ namespace Il2CppInspector.CLI
foreach (var prop in optionsObject.GetType().GetProperties()) { foreach (var prop in optionsObject.GetType().GetProperties()) {
var targetProp = plugin.Options.First(x => x.Name == prop.Name); var targetProp = plugin.Options.First(x => x.Name == prop.Name);
var value = prop.GetValue(optionsObject);
// Validate hex strings // Validate hex strings
if (targetProp is IPluginOptionNumber n && n.Style == PluginOptionNumberStyle.Hex) { if (targetProp is IPluginOptionNumber n && n.Style == PluginOptionNumberStyle.Hex) {
try { try {
n.Value = Convert.ChangeType(Convert.ToInt64((string) prop.GetValue(optionsObject), 16), n.Value.GetType()); n.Value = Convert.ChangeType(Convert.ToInt64((string) value, 16), n.Value.GetType());
} }
catch (Exception ex) when (ex is ArgumentException || ex is FormatException || ex is OverflowException) { catch (Exception ex) when (ex is ArgumentException || ex is FormatException || ex is OverflowException) {
Console.Error.WriteLine($"Plugin option error: {prop.Name} must be a hex value (optionally starting with '0x'), and less than the maximum value"); Console.Error.WriteLine($"Plugin option error: {prop.Name} must be a hex value (optionally starting with '0x'), and less than the maximum value");
@@ -203,9 +210,18 @@ namespace Il2CppInspector.CLI
} }
} }
// Enums
else if (targetProp.Value?.GetType().IsEnum ?? false) {
if (Enum.TryParse(targetProp.Value.GetType(), value.ToString(), out var enumValue))
targetProp.Value = enumValue;
else {
Console.Error.WriteLine($"Plugin option error: Invalid enum value when setting '{targetProp.Name}' to '{value}'");
hasErrors = true;
}
}
// All other input types // All other input types
else { else {
var value = prop.GetValue(optionsObject);
try { try {
targetProp.Value = value; targetProp.Value = value;
} catch (Exception ex) { } catch (Exception ex) {