rksoftware

Visual Studio とか C# とかが好きです

オブジェクトのプロパティ/フィールドの名前と値を配列にする

オブジェクトのプロパティ/フィールドの名前と値を配列にしたいことが、あまりないかもしれませんが、たまにはあるかもしれません。
今がそのたまにです。

大したコードではないですが、検索する方もいるかもしれないのでメモ。

概要

リフレクションで名前と値の組のタプルを作ってそれを Select でシーケンスにして Concat でつなげて SelectMany で一本化して ToArray で配列にします。簡単ですね。

var s = 1;
var type = s.GetType();
var nameAndValues =
    Enumerable.Concat(
        type.GetFields().Select(f => (f.Name, f.GetValue(s)))
        , type.GetProperties().Select(p => (p.Name, p.GetValue(s))
    )
    .SelectMany(kv => new string?[] { kv.Item1, (kv.Item2?.ToString()) })
    .ToArray();

きのこ vs たけのこ 終戦の道が示されるも身体は闘争を求める

きのこ vs たけのこ。
世界をを二分するきのことたけのこの陣営は互いに軍を形成し、 もはや開戦の理由など誰もわからなくなった銀河規模の戦争を100年間継続していた。

その争いを終戦に導く提案を思いついたので、世界に問うてみました。
一番を二つ選べるようにすれば、皆がきのことたけのこを両方選んで終戦するのでは!

■ 結果

一番を二つ選べるようにする

身体は闘争を求める

いかがでしたか?

Visual Studio 2019 の バージョン16.11.9 がリリースされました。Windows Terminal と合わせたときの問題が解消されています。 アップデート必須です!

Visual Studio 2019 の バージョン16.11.9 がリリースされました。

注目点は次の問題が解消された点です。

  • Windowsターミナルをデフォルトのターミナルとして使用すると、アプリケーションを複数回デバッグできない問題を修正しました。

これは大きいですね。.NET 世代になってコンソールアプリを作る機会が非常に増えていると思います。アップデート必須ですね。

補足

デフォルトのターミナルとして Windows Terminal を背帝する方法

Visual Studio でコンソールアプリのデバッグ時に Windows Terminal で実行されるようにする

Windows Terminal は好きですか? 私は結構好きです。
Visual Studio Code、Visual Studio に続いて PC 触っている際に触っている時間の多いソフトだと思います。こうなってくると Visual Studio でコンソールアプリのデバッグ時にもコマンド プロンプトでなく Windows Terminal で実行したい、そう思いますよね?

Visual Studio の設定とかでできるのかと思って設定をあさってみましたが、見つけられませんでした。
代わりに Winsows 11 では規定のターミナルという設定があることを知りました。この設定を Windows Terminal にしておけば、デバッグ実行も Windows Terminal のものです。

■ 設定方法

[ 設定 ] アプリ > プライバシーとセキュリティ > 開発者向け

で、結構下にスクロールしたところに

ターミナル

という項目があります。ここで Windows Terminal を選択。これだけです。

簡単ですね。

Generic Host でコマンドライン引数を扱う

最近コマンドライン引数をいろいろ頑張っていますが、実は標準の Generic Host ではデフォルトでコマンドライン引数を扱う機能があります。

こんなコードになります。

using Microsoft.Extensions.Configuration;
using Microsoft.Extensions.DependencyInjection;
using Microsoft.Extensions.Hosting;

using IHost host = new HostBuilder()
    .ConfigureServices((_, services) => services.AddSingleton<IService, Service>())
    .ConfigureAppConfiguration(config => config.AddCommandLine(args))
    .Build();
var service = host.Services.GetService<IService>();
service.Run();

interface IService
{
    string Run();
}

class Service : IService
{
    IConfiguration configuration;
    public Service(IConfiguration configuration) => this.configuration = configuration;
    public string Run() => configuration["c"];
}

実際に引数の解釈を行う部分は次の一文です。

.ConfigureAppConfiguration(config => config.AddCommandLine(args))

これで IConfiguration の中に引数を解釈したキーと値が文字列をキーとしたインデクサで取得できるように格納されます。
使う際にはコンストラクタ引数に IConfiguration 型の引数を設定しておけばインジェクションされます。次のように。簡単ですね。

IConfiguration configuration;
public Service(IConfiguration configuration) => this.configuration = configuration;

で、使う際にはインデクサでキーを指定します。次の例では "c" というキーの値を取得しています。

public string Run() => configuration["c"];

または CreateDefaultBuilder でも内部で同じことをしてくれます。

using IHost host = Host
    .CreateDefaultBuilder(args)
    .ConfigureServices((_, services) => services.AddSingleton<IService, Service>())
    .Build();

■ キーと値

この素晴らしい便利機能ですが、引数を何でもはキーと値で持ってくれはしません。キーと値でセットで指定されている引数だけです。

前述のドキュメントによると次のような形式がキーと値のセットとして扱われるそうです。

--alt3=value3
/alt4=value4
--alt5 value5
/alt6 value6

最近よく私がコマンドライン引数を扱うテストで使っている次の引数を与えると

<コマンド> aparam -a aopt -d -b bopt bparam /c copt

次の一組しか保持してくれませんでした。(元の配列データ自体は別途保持しているので失われはしませんが)

キー
c copt

ちょっと扱いにくい気がします。

Win11 のスタートメニューの「おすすめ」を消す方法

Win11 のスタートメニューには おすすめ という欄があり、ここに最近使ったファイルが表示されたりなどします。
これを消したい方、とても多いと思います。

■ お前を消す方法

  1. タスクバーの一番左のスタートメニューボタンを右クリック
  2. 設定
  3. 個人設定
  4. スタート
  5. 最近開いた項目をスタート、ジャンプリスト、ファイル エクスプローラーに表示する を off

これで おすすめ に最近使ったファイルが表示されなくなります。
(最近追加したアプリだけ表示されます)

■ 最近追加したアプリも消したい場合

6. 最近追加したアプリを表示する も off

簡単ですね。

Surface Laptop 3 でスト5

ある時突然ストリートファイター5がやりたくなることが誰でもあると思います。
そして、手元には Surface Laptop 3だけしかない。そんな日もたまにはあります。

■ ベンチマーク結果

画面品質が標準設定ではだめでしたがを低にしてたら行けました。
ゲームコントローラーの用意とかまだあるので遊ぶのは少し先になるかもしれませんが、まずは一段階クリアです。