読者です 読者をやめる 読者になる 読者になる

(:3[kanのメモ帳]

個人ゲーム開発者kan.kikuchiのメモ的技術ブログ。月木更新でUnity関連がメイン。

Genericsメソッド内で型に応じた処理を行う【C#】


このエントリーをはてなブックマークに追加

Genericsメソッドとは

Genericsメソッドとは、いろいろな型に対応したメソッドの事です。

型だけ違って処理の内容が同じようなものを作るときに使う。


例えば複数の型に対応した保存用のメソッドを作成する時、

以下のようにオーバーロードを使って、型の分だけメソッドを作る事でも実現可能です。

void  Save(string key , int value)
{
  /*保存処理*/
}

void  Save(string key , float value)
{
  /*保存処理*/
}

void  Save(string key , string value)
{
  /*保存処理*/
}


この場合、処理内容がほぼ変わらない時は無駄にメソッドだけが増える事になります。

そこで、Genericsを使うと以下のように一つのメソッドですみます。

void  Save<T>(string key , T value)  where T : Object
{
  /*保存処理*/
}

//使用例
Save<int>(key, 10);


Tに任意の型を指定する事で、複数の型に対応できるメソッドとなります。


また、whereを使う事でTに条件を付ける事も可能です。

上記の場合TがObjectでないとエラーになります。


型判定

本題のGenericsメソッド内で、Tに指定された型に応じて処理を行いたい場合ですが、

typeofを使う事で実現可能です。


例えば先ほどのSaveメソッドで、string型の時だけ特別な処理を挟みたい場合は

以下のようにします。

void  Save<T>(string key , T value)  where T : Object
{
    if(typeof(T) == typeof(string)){
     /*string用の処理*/
    }
  /*保存処理*/
}


型毎に処理が全く違う場合はオーバーロードで良いと思いますが、一部の型だけちょっと処理が違う、

という場合等は上記のようにGenericsとtypeofを使うのも良いかもしれません。