同じ名前で同じように呼び出せるメソッドがあるとします。
しかし、クラス間に継承関係はありません。
これを同じように呼び出す方法はあるでしょうか?
リフレクションの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!