2020年11月24日
川俣晶の縁側ソフトウェアC# コーディング How To total 416 count

【入門級】継承関係にないクラスの同名メソッドを同じように呼び出す

Written By: 川俣 晶連絡先

 同じ名前で同じように呼び出せるメソッドがあるとします。

 しかし、クラス間に継承関係はありません。

 これを同じように呼び出す方法はあるでしょうか?

 リフレクションのAPIで動的にメソッドを取得して呼び出すことはできますが、それよりもdynamic型を使うと簡単です。dynamic型は型チェックを一切行わない代わりに、呼び出し条件に合ったメソッドなら型に関係なく呼び出せます。

罠の数々 §

  • dynamic型は型チェックをしてくれないので、正しい呼び出しかどうかはプログラマーが自分で確認する必要がある。割と面倒くさいぞ。だからみんな使わない。
  • 同じように呼び出せれば呼び出せる。引数が厳密には違っていてもいい。サンプルソースも引数が厳密には違っている。

参考リンク §

組み込みの参照型 (C# リファレンス)

 dynamic型の説明は【組み込みの参照型】の中にある。つまり、dynamic型は常に参照型だ。さて、どんな型の値でも入れられるという意味ではdynamic型とobject型は似ている。しかし、同じではない。どこが違うのだろうか。上記のリンクを辿って調べてみよう。

リポジトリ §

https://github.com/autumn009/cshowto

DynamicType §

using System;

class A

{

    public void Sub()

    {

        Console.WriteLine("I'm class A!");

    }

}

class B

{

    public void Sub(string a = "Dummy")

    {

        Console.WriteLine("I'm class B!");

    }

}

class Program

{

    private static void commonWork(dynamic arg)

    {

        arg.Sub();

    }

    static void Main()

    {

        commonWork(new A());

        commonWork(new B());

    }

}

実行結果

I'm class A!

I'm class B!

COOL C# CREW

C#ハウツー連載の解説増量、カラーのソース、新規書き下ろし追加の読みやすい単行本はこちら。

C#ハウツー: 逆引き入門・こんな機能はどう書くの?