以下の内容はhttps://rksoftware.hatenablog.com/entry/2025/05/20/000005より取得しました。


大量のクラスを整える際に際に GitHub Copilot に手伝ってもらいたかった

前回、大量のクラスをオートパイロット的に整えてくれないかと思ったもののいまいちでした。
こんどはその大量のクラスと対になるクラスがあるので、これを 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 様様です。




以上の内容はhttps://rksoftware.hatenablog.com/entry/2025/05/20/000005より取得しました。
このページはhttp://font.textar.tv/のウェブフォントを使用してます

不具合報告/要望等はこちらへお願いします。
モバイルやる夫Viewer Ver0.14