以往的Extension Method算是好用的功能,但唯獨沒有外掛data member的能力,感覺有點受限,如今新版C#把這最後一堆補上了。

下面是簡單範例:

public class Circle
{
    private double _radius = 0.0;

    public Circle(double radius)
    {
        Radius = radius; 
    }

    public Circle() { }

    //半徑
    public double Radius
    {
        get => _radius;
        set
        {
            if (value < 0)
            {
                throw new ArgumentOutOfRangeException(nameof(value), "Radius cannot be negative.");
            }
            _radius = value;
        }
    }
}

上面先定義一個圓型的類別,接下來在寫各種method及member:

public static class CircleExtensions
{
    extension(Circle c)
    {
        //計算圓面積
        public double Area()
        {
            return Math.PI * c.Radius * c.Radius;
        }

        //直徑
        public double Diameter() => 2 * c.Radius;
        public double Diameter2 => c.Radius * 2;

        //計算圓周長
        public double Circumference()
        {
            return Math.PI * c.Radius * 2;
        }
    }

    extension(Circle)
    {
        public static double GetPi()
        {
            return Math.PI;
        }
    }
}

上面的extension分兩個部份,一個非靜態,一個為靜態,可看到丟進去的參數不同,一個要丟物件,一個丟型別就好。

參考資料