C# 14のextensionブロックを使って既存クラスにファクトリメソッドを生やす

C# 14のextensionブロックを使って既存クラスにファクトリメソッドを生やす方法です。

extensionブロック?

C# 14では、extensionブロックが追加されました。

これにより、今までの拡張メソッドに加えて「拡張プロパティ」が作成できるようになりました。

light11.hatenadiary.com

このextensionブロックを使うと、staticな拡張メソッドを作ることができます。

本記事では、この機能を使って既存クラスにファクトリメソッドを作ります

使い方

これまでのC#では、拡張メソッドはインスタンスに対して行うものだったので、staticなメソッドを生やすことはできませんでした。

これに対して、C# 14からのextension blockを使うと、以下のようにして既存のクラスにstaticなメソッドを追加することができます。

using System.Drawing;
using System.Globalization;

public static class ColorExtensions
{
    extension(Color)
    {
        public static Color FromHex(string hex)
        {
            if (hex.StartsWith("#")) hex = hex[1..];
            var r = int.Parse(hex[..2], NumberStyles.HexNumber);
            var g = int.Parse(hex[2..4], NumberStyles.HexNumber);
            var b = int.Parse(hex[4..6], NumberStyles.HexNumber);
            return Color.FromArgb(r, g, b);
        }
    }
}

これで以下のように、既存のカラークラスのファクトリーメソッドとして使用することができるようになりました

// 使い方
var color = Color.FromHex("#32CD32");