Open
Description
So given
var myOptions = new Option<string[]>(
name: "--my",
description: "items",
parseArgument: ParseMyItems);
and
internal static string[] ParseMyItems(ArgumentResult result)
{
//manipulate/validate/parse items
return result.Values();
}
I want to test ParseMyItems
. so i need to be able to create an instance of ArgumentResult
. but the constructor is internal
internal ArgumentResult(
Argument argument,
SymbolResult? parent) : base(argument, parent)
{
Argument = argument;
}
So how do i get an instance of ArgumentResult
.
Currently i have this hack:
public static class ArgumentBuilder
{
static Func<string[], ArgumentResult> construct;
static ArgumentBuilder()
{
var tokensField = typeof(ArgumentResult).GetField("_tokens", BindingFlags.NonPublic | BindingFlags.Instance)!;
var constructor = typeof(ArgumentResult).GetConstructors(BindingFlags.NonPublic | BindingFlags.Instance)
.Single();
construct = inputs =>
{
var invoke = constructor.Invoke(
new object?[]
{
new Argument<string[]>(_ => inputs),
null
})!;
var result = (ArgumentResult) invoke;
var tokens = (List<Token>) tokensField.GetValue(result)!;
tokens.AddRange(inputs.Select(_ => new Token(_, TokenType.Argument, null!)));
return result;
};
}
public static ArgumentResult Build(params string[] values) =>
construct(values);
}
then i can do
var argument = ArgumentBuilder.Build("value1", "value2");
ParseMyItems(argument)
but there must be a better way