ConsoleAppFramework(旧MicroBatchFramework)の入力文字列でパースしてくれる型について確認

<blockquote class="twitter-tweet"><p lang="ja" dir="ltr">ConsoleAppFrameworkリリースしました！破壊的大変更でより便利に！なりました。 / “neue cc - ConsoleAppFramework - .NET Coreコンソールアプリ作成のためのマイクロフレームワーク（旧MicroBatchFramework)” <a href="https://t.co/CEXtQ4iJwp">https://t.co/CEXtQ4iJwp</a></p>&mdash; neuecc (@neuecc) <a href="https://twitter.com/neuecc/status/1215183642814664705?ref_src=twsrc%5Etfw">January 9, 2020</a></blockquote> 

とのことで記事修正しました。

# はじめに
[ConsoleAppFramework][]でどのような入力をパースしてくれるか確認してみたので投稿します。
~~パースには[Utf8Json][]を使用していました。~~ 

> be careful with JSON string double quotation.
> JSON serializer is System.Text.Json. You can pass JsonSerializerOptions to SerivceProvider when you want to configure serializer behavior.

↑
[Github][ConsoleAppFramework]から抜粋

JsonシリアライザーがSystem.Text.Jsonに変わったので注意です。


Stringとintは割愛。

## 環境
+ ConsoleAppFramework 2.0.1
+ [試したソース](https://github.com/kwhrkzk/ConsoleAppFrameworkSample)

# bool

```C#
        [Command("bool")]
        public void BoolParam([Option("x", "説明")]bool x)
        {
            Console.WriteLine(x.ToString());
            Environment.ExitCode = 0;
        }
```
としたとき

```C#
dotnet run -- bool -x false
```
で動作させたら

```
False
```
でOK

# Enum

```C#
        public enum MyEnum
        {
            Enum1,
            Enum2
        }

        [Command("enum")]
        public void EnumParam([Option("x", "説明")]MyEnum x)
        {
            Console.WriteLine(Enum.GetName(typeof(MyEnum), x));
            Environment.ExitCode = 0;
        }
```

としたとき

```C#
dotnet run -- enum -x Enum1      
```

で動作させたら

```
Enum1
```
でOK

# IEnumerable

```C#
        public void ListStringParam([Option("x", "説明")]List<string> x)
        {
            x.ForEach(item => Console.WriteLine(item));
            Environment.ExitCode = 0;
        }

        public void ListDoubleParam([Option("x", "説明")]List<double> x)
        {
            x.ForEach(item => Console.WriteLine(item));
            Environment.ExitCode = 0;
        }

        public void ListIntParam([Option("x", "説明")]List<int> x)
        {
            x.ForEach(item => Console.WriteLine(item));
            Environment.ExitCode = 0;
        }
```

としたとき

```C#

dotnet run -- listString -x "foo bar"    
dotnet run -- listDouble -x "0.5 1000000000000000000 2"
dotnet run -- listDouble -x "[0.5,1000000000000000000,2]"
dotnet run -- listInt -x "0 1 2"
```

で動作させたらOK(結果割愛)

json的に配列を示す"["と"]"がなくても自動補完してくれます。

# 独自クラス

```C#
        public class FooBar
        {
            public int foo { get; set; }

            public string bar { get; set; }
        }

        [Command("myClass")]
        public void MyClassParam([Option("x", "説明")]FooBar x)
        {
            Console.WriteLine(x.foo.ToString());
            Console.WriteLine(x.bar.ToString());
            Environment.ExitCode = 0;
        }
```

としたとき

```C#
dotnet run -- myClass -x "{`\`"foo`\`":0,`\`"bar`\`":`\`"str`\`"}"
```

で動作させたら

```
0
str
```

でOK
追加で

```C#
        public class FooBarBaz
        {
            [JsonPropertyName("foobar")]
            public FooBar FooBarProperty { get; set; }

            [JsonPropertyName("baz")]
            public string BazProperty { get; set; }
        }

         [Command("myClass2")]
       public void MyClassParam2([Option("x", "説明")]FooBarBaz x)
        {
            Console.WriteLine(x.FooBarProperty.foo);
            Console.WriteLine(x.FooBarProperty.bar);
            Console.WriteLine(x.BazProperty);
            Environment.ExitCode = 0;
        }
```
として

```C#
dotnet run -- myClass2 -x "{`\`"foobar`\`":{`\`"foo`\`":0,`\`"bar`\`":`\`"str`\`"},`\`"baz`\`":`\`"str2`\`"}"
```

で動作させたら

```
0
str
str2
```

で入れ子でも問題なし。


# まとめ
なんでもいけそうです。困ったら[System.Text.Json][]を参照すると良さげです。
今回powershellからdotnet runを実行したのですがダブルクォーテーション(")のエスケープ処理が面倒くさかったです。
C#的にはバックスラッシュ(\\)でエスケープが必要でpowershell的にはバッククォート（`）でエスケープが必要です。
なので

```
"
```
を入力させるのに

```
`\`"
```

↑だけ必要です。

# 参考
+ [PowerShell 使い方メモ](https://qiita.com/opengl-8080/items/bb0f5e4f1c7ce045cc57)
+ [ConsoleAppFramework][]
+ [System.Text.Json][]


[ConsoleAppFramework]:https://github.com/Cysharp/ConsoleAppFramework
[MicroBatchFramework]:https://github.com/Cysharp/MicroBatchFramework

[BatchEngine]:https://github.com/Cysharp/MicroBatchFramework/blob/5c966f13cb7fb0392ca52a9241edacee80b128eb/src/MicroBatchFramework/BatchEngine.cs

[System.Text.Json]:https://docs.microsoft.com/ja-jp/dotnet/api/system.text.json?view=netcore-3.1
[Utf8Json]:https://github.com/neuecc/Utf8Json
[Utf8Json.AspNetCoreMvcFormatter]:https://www.nuget.org/packages/Utf8Json.AspNetCoreMvcFormatter