【C#】拡張メソッドの使い方入門【Unity】

C#機能バージョン対応表作成しました。
こちらの記事も合わせてご覧ください。
拡張メソッドとは
【既存の型(クラス)に対して、元の型の変更や継承をすることなく、新たなメソッドを追加する仕組みです。】
ふ〜ん。そうなんだ。
で終わってしまわないように、実際に作成してみることに。
今回は、enumでやってみます。
サンプルコード1
1 2 3 4 5 6 7 8 9 10 11 |
public enum DayConstants { Sun, Mon, Tue, Wed, Thu, Fri, Sat, }; |
日曜日から土曜日までenumで定義しました。
次に拡張メソッドを定義します。
サンプルコード2
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
public static class DayConstantsExtension { public static DayConstants GetNextDayConstants(this DayConstants dayConstant) { switch (dayConstant) { case DayConstants.Sat: return DayConstants.Sun; default: return ++dayConstant; } } } |
拡張メソッドを作成する場合は、第一引数に拡張したい型にthisをつけて定義します。
※第二引数以降を設定する場合はthisをつけません
今回のメソッドでは、enum型のまま次の曜日を返すように処理を作成しました。
・月曜日 なら 火曜日を返す
・土曜日 なら 日曜日を返す
土曜日以外はインクリメントした値を返し、土曜日の場合は日曜日を返すようにしています。
これで、拡張メソッドの作成は終了です。
次に、拡張メソッドを実際に作成してみます。
サンプルコード3
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 |
using System.Collections; using System.Collections.Generic; using UnityEngine; using DG.Tweening; using System; public class DayConstantsExtensionTest : MonoBehaviour { // Use this for initialization void Start() { Debug.Log("=== Debug.Log(dayConstant) =========================================="); foreach (DayConstants dayConstant in DayConstants.GetValues(typeof(DayConstants))) { Debug.Log(dayConstant); } Debug.Log("=== Debug.Log(dayConstant.GetNextDayConstants()) ==================="); foreach (DayConstants dayConstant in DayConstants.GetValues(typeof(DayConstants))) { Debug.Log(dayConstant.GetNextDayConstants()); } } // Update is called once per frame void Update() { } } |
一つ目のforeachではenumの定義された順番にログを出力します。(今回の本題ではないので説明を省きます)
二つ目のforeach内の【dayConstant.GetNextDayConstants()】に注目です。
ここで拡張メソッドを呼び出しています。
このときに覚えるポイントは以下です。
①拡張メソッドを呼び出す時は、【拡張元の型】 + 【 . (ピリオド)】で呼び出す。
②拡張メソッドで定義した第一引数には呼び出し元の型に設定されている値が渡される(今回は第一引数の this DayConstants dayConstant に渡される)
③拡張メソッドで第二引数を定義している場合は、拡張メソッドを呼び出す際に引数を1つ渡す必要がある
※ もしも第三引数まで定義されている場合は、拡張メソッドを呼び出す際に引数を2つ渡す必要がある
public static DayConstants GetNextDayConstants(this DayConstants dayConstant, int a, int b)
上記の拡張メソッドを呼び出すときは
dayConstant.GetNextDayConstants(100,200)
のように呼び出してあげる必要あり
最後に実行結果です。

ちゃんと、次の曜日が値として返されていますね!(土曜日の場合もenumで最初に定義して日曜日が返されている!!)
【まとめ】
①既存の型(クラス)に対して、元の型の変更や継承をすることなく、新たなメソッドを追加する仕組みである。
②【拡張元の型】 + 【 . (ピリオド)】で呼び出すことができる
③拡張メソッドの第一引数には【拡張元の型の値】、第二引数以降には呼び出す際に渡した引数の値が設定される
拡張メソッドは enum型 を使用する時は特に便利だと思う!