Skip to content

Commit c8b76b4

Browse files
committed
array handling, more easiness
1 parent 8f4450f commit c8b76b4

File tree

2 files changed

+44
-5
lines changed

2 files changed

+44
-5
lines changed

sandbox/SingleContainedApp/Program.cs

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@
66
using Microsoft.Extensions.Logging;
77
using Microsoft.Extensions.Options;
88
using System;
9+
using System.Collections.Generic;
910
using System.IO;
1011
using System.Reflection;
1112
using System.Text;
@@ -114,9 +115,9 @@ public void Help()
114115

115116
public class ComplexArgTest : BatchBase
116117
{
117-
public void Foo(int[] array, Person person)
118+
public void Foo(string[] array, Person person)
118119
{
119-
Console.WriteLine(string.Join(", ", array));
120+
Console.WriteLine(array.Length + ":" + string.Join(", ", array));
120121
Console.WriteLine(person.Age + ":" + person.Name);
121122
}
122123
}
@@ -131,7 +132,7 @@ class Program
131132
{
132133
static async Task Main(string[] args)
133134
{
134-
args = @"-array [10,20,30] -person {""Age"":10,""Name"":""foo""}".Split(' ');
135+
args = new[] { "-array", "foo bar baz", "-person", @"{""Age"":10,""Name"":""foo""}" };
135136

136137
await BatchHost.CreateDefaultBuilder()
137138
.ConfigureServices((hostContext, services) =>

src/MicroBatchFramework/BatchEngine.cs

Lines changed: 40 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -249,7 +249,22 @@ static bool TryGetInvokeArguments(ParameterInfo[] parameters, string?[] args, in
249249
var v = value.Value;
250250
if (!(v.StartsWith("[") && v.EndsWith("]")))
251251
{
252-
v = "[" + v + "]";
252+
var elemType = UnwrapCollectionElementType(parameters[i].ParameterType);
253+
if (elemType == typeof(string))
254+
{
255+
if (!(v.StartsWith("\"") && v.EndsWith("\"")))
256+
{
257+
v = "[" + string.Join(",", v.Split(' ').Select(x => "\"" + x + "\"")) + "]";
258+
}
259+
else
260+
{
261+
v = "[" + v + "]";
262+
}
263+
}
264+
else
265+
{
266+
v = "[" + string.Join(",", v.Trim('\'', '\"').Split(' ')) + "]";
267+
}
253268
}
254269
try
255270
{
@@ -284,7 +299,12 @@ static bool TryGetInvokeArguments(ParameterInfo[] parameters, string?[] args, in
284299
}
285300
else
286301
{
287-
errorMessage = "Required parameter \"" + item.Name + "\"" + " not found in argument.";
302+
var name = item.Name;
303+
if (option?.ShortName != null)
304+
{
305+
name = item.Name + "(" + "-" + option.ShortName + ")";
306+
}
307+
errorMessage = "Required parameter \"" + name + "\"" + " not found in argument.";
288308
return false;
289309
}
290310
}
@@ -293,6 +313,24 @@ static bool TryGetInvokeArguments(ParameterInfo[] parameters, string?[] args, in
293313
return true;
294314
}
295315

316+
static Type? UnwrapCollectionElementType(Type collectionType)
317+
{
318+
if (collectionType.IsArray)
319+
{
320+
return collectionType.GetElementType();
321+
}
322+
323+
foreach (var i in collectionType.GetInterfaces())
324+
{
325+
if (i.IsGenericType && (i.GetGenericTypeDefinition() == typeof(IEnumerable<>)))
326+
{
327+
return i.GetGenericArguments()[0];
328+
}
329+
}
330+
331+
return null;
332+
}
333+
296334
static ReadOnlyDictionary<string, OptionParameter> ParseArgument(string?[] args, int argsOffset)
297335
{
298336
var dict = new Dictionary<string, OptionParameter>(args.Length, StringComparer.OrdinalIgnoreCase);

0 commit comments

Comments
 (0)