はかせのラボ

私の頭の中を書いていく雑記ブログです

プログラミング リフレクションについて簡単に書いてみる

あいさつ

どうも、はかせです。
今回は久しぶりのコラム回です。
今回のコラムテーマはリフレクションです。
(実行環境はUnity2018.3.6f1です)

リフレクションって?

よくネットとかで超絶テクい雰囲気を醸し出している
プログラマーが使っているイメージが強いあれです。
とはいえ使ってみるだけなら割と誰でもできます。
(使いこなすのは激ムズですが・・・)

リフレクションってのは実行時のメタデータを用いて
ランタイムでプログラムの情報の読み書きすることです。

簡単な例を上げると
・クラスやメソッドの名前を取得する
・実装されているメソッド一覧を表示する
・変数の型情報を表示する

ってとこでしょうか。

使いどころとしてはツールとか作るときに
ユーザーの使いやすさを向上させるとかですかね。
実行時型情報とか使うんでパフォーマンスにはあまり期待できないです。

変数の型情報を表示してみる

では実際にやってみましょう。
今回は例で挙げた三つ目の型情報の表示をやってみます。

public class NewBehaviourScriptTest : MonoBehaviour
{
    public object mObject;
    // Start is called before the first frame update
    void Start()
    {
        mObject = "string";
        Debug.Log(mObject.GetType().Name);
        mObject = 10;
        Debug.Log(mObject.GetType().Name);
    }
}

objectってのはC#のあらゆる型の基底クラスです。
あらゆる型はこのobject型にキャストできますし、
object型はあらゆる型にキャストできます。(成功率は100%ではないですが)

今回はobject型から型情報を取得するGetTypeメソッドを用いて
mObjectに入ってるデータの型を表示します。
f:id:hakase0274:20190723233741p:plain

データの宣言とか弄らなくてもmObjectにツッコむデータを変えただけで
型が変わりましたね。

これを使えば何が放り込まれるかわからないような
曖昧なデータでもプログラムを変えることなく対応できます。
(PythonPHPのような動的型付に近い感覚)

あとがき

今回はリフレクションについてでした。
私も触ってみるまでは
「超テクプログラマーが使う黒魔術でしょう・・?怖いわぁ」
なんて思ってましたが、ちょっと調べてちょっと使ってみれば誰でも使える機能だと実感しました。

もちろん極めようとすればあながちイメージ間違ってない気がしますが、
自分やその周りで使うオレオレツール程度だったら白魔術程度で済みます。
(実際私も誰にも触らせる予定のないツールとかだと結構オレオレやってますw)

リフレクションはある程度使えるだけで
静的型付言語の使い勝手がぐんと上がりますので、
簡単なものからでもいいので触ってみませんか?
(そして魔術の沼へハマりましょうw)

それでは今回はこの辺でノシ