DataGridとListBoxのSelectedItemsを同じように処理したい(C# WPF)

C#

BehaviorやEventArgs等からコントロールへの参照を取得し、SelectedItems/SelectedItemのように同じ名称のプロパティを利用したいとします。

例えばSelectionChangedEventArgsからSelectedItemsを取得するとします。

DataGrid版
var items = ((DataGrid)e.Source).SelectedItems;

ListBox版
var items = ((ListView)e.Source).SelectedItems;

DataGridとListBoxでそれぞれでキャストのやり方を変えなければいけません。
ソースコードを使いまわししたい時に若干面倒ですよね?
私は面倒です。

そのコントロールがSelectedItemsという名前のプロパティを持っていると分かっている時は、いったんdynamic型に格納してしまえば元の型がなんであれ取り出すことができます。

dynamic control = e.Source;
var list = control.SelectedItems;

逆にSelectedItemsプロパティを持ってない型にこれを行うとエラーになりますので注意です。

こういったプロパティ名やメソッド名のみを手掛かりに処理を行うことをダックタイピングと言うそうです。C#の場合、通常はインターフェースを使いますよね。ダックタイピングはインターフェースに頼らず名称の一致しか見ないので、柔軟に使える反面、静的型付け言語で利用する意味も薄いです。便利なんだけど使いどころはわきまえましょう。

コメント