前回、大量のクラスをオートパイロット的に整えてくれないかと思ったもののいまいちでした。
こんどはその大量のクラスと対になるクラスがあるので、これを GitHub Copilot に手伝ってもらいながら作っていこうと思います。
rksoftware.hatenablog.com
■ 大量のクラスをファイルレベルでコピーして
とりあえず前回作ったファイルをファイルレベルでコピーしてリネーム。すでにできているクラスを参考に、GitHub Copilot に書き換えていってもらいます。
PluginApplicationEnricherServiceCollectionCaller クラスが完成コードです。namespace も踏襲し、既存コードを捨ててクラスを完成させてください
■ 出来上がってほしいクラス
こんな感じです。これを大量に作っていきます。
using System; using System.Collections.Generic; using System.Reflection; using System.Security.AccessControl; using System.Text; using System.Xml.Linq; namespace RkSoftware.RKPlugin.DependencyInjection.Internals; internal static class PluginApplicationEnricherServiceCollectionCaller { public static object? AddServiceLogEnricher(this object? services) { var type = services!.GetType(); var methodInfo = type.GetMethods(BindingFlags.NonPublic | BindingFlags.Instance).Where(x => x.Name == nameof(AddServiceLogEnricher) && x.GetGenericArguments().Length == 0 && x.GetParameters().Length == 0 ).FirstOrDefault(); var method = methodInfo; return method?.Invoke(services, []); } public static object? AddServiceLogEnricher(this object? services, Action<object?> configure) { var type = services!.GetType(); var methodInfo = type.GetMethods(BindingFlags.NonPublic | BindingFlags.Instance).Where(x => x.Name == nameof(AddServiceLogEnricher) && x.GetGenericArguments().Length == 0 && x.GetParameters().Length == 1 && x.GetParameters()[0].Name == nameof(configure) && x.GetParameters()[0].ParameterType.GenericTypeArguments.Length == 1 ).FirstOrDefault(); var method = methodInfo; return method?.Invoke(services, [configure]); } public static object? AddServiceLogEnricher_(this object? services, object? section) { var type = services!.GetType(); var methodInfo = type.GetMethods(BindingFlags.NonPublic | BindingFlags.Instance).Where(x => x.Name == nameof(AddServiceLogEnricher_) && x.GetGenericArguments().Length == 0 && x.GetParameters().Length == 1 && x.GetParameters()[0].Name == nameof(section) && x.GetParameters()[0].ParameterType.GenericTypeArguments.Length == 0 ).FirstOrDefault(); var method = methodInfo; return method?.Invoke(services, [section]); } }
■ 変更前
クラスをコピーしただけの状態はこんな感じです。メソッドのしぐにちゃとクラスの名前の本体? 部分を維持してファイルを書き換えてもらいたい。
namespace Microsoft.Extensions.DependencyInjection; public static class CommonHealthChecksExtensions { public static List<string> Invoked = new List<string>(); static object? Add(string name) { Invoked.Add(name); return null; } public static object? AddTelemetryHealthCheckPublisher(this object? services) => Add("public static object? AddTelemetryHealthCheckPublisher(this object? services)"); public static object? AddTelemetryHealthCheckPublisher(this object? services, object? section) => Add("public static object? AddTelemetryHealthCheckPublisher(this object? services, object? section)"); public static object? AddTelemetryHealthCheckPublisher(this object? services, Action<object?> configure) => Add("public static object? AddTelemetryHealthCheckPublisher(this object? services, Action<object?> configure)"); }
■ 結果
出来上がっているクラスは、前回の経験を生かしてファイル添付。

行けそうですね。

■ いけなかった
大量に作業しすぎて画面写真撮っていないですが、意外とうまくいかない。
メソッド数が、添付ファイルに合わせて勝手に数を変えてしまうことが頻発。
プロンプトを改善してみました。
PluginApplicationEnricherServiceCollectionCaller クラスがサンプルコードです。namespace も踏襲し、既存コードを捨ててクラスを完成させてください メソッドの数はサンプルとは異なります、メソッド数までサンプルを踏襲はしないでください。 クラス名とメソッド名は既存コードが正しいので、サンプルで上書きするのではなくサンプルはサンプルです。
結果、メソッド数を添付ファイルに合わせることはなくなりましたが、それでもメソッド数は割と無茶苦茶です。
無念。
それでも手で作っていくよりはマシなので、いったん無茶苦茶なまま進めてビルドはできるようにして、後のことは後で考えます。
もし手で作っていたらビルドまででも遠い道のりだったので、GitHub Copilot 様様です。