同様のタスクを実行しようとしている多くの投稿を読みましたが、問題の適切な解決策を見つけることができません。
実行時にオブジェクトを動的にキャストしようとしています。(多くの人がそれができないと言うことを知っています、そしてそれができるかどうかは実際にはわかりません...)私の問題はTreeView
、Windows Forms Application
を表示するために動的に作成されていることOrg Chart
です。
TreeView
3つのテーブルからのプルのデータ: Departments
、、。Jobs
Employees
Tables
asをインポートすると、 Local DataSource
3つのテーブルすべてがオブジェクトとして取得され、オブジェクトタイプDataSet
のテンプレートがDataRow
元のテーブルにキャストされます(プロパティとしてのすべての列を含む)。(linqと同様-Oracle DBを除く)
オブジェクトを作成TreeNode
し、自分の説明フィールドをプロパティDataRow
として使用してから、それ自体をプロパティとしてTreeNode.Text
アタッチします。このように、キャストするだけで直接データにアクセスできます。DataRow
TreeNode.Tag
TreeNode
dsMyDataSource.DepartmentRow =
(dsMyDataSource.DepartmentRow)treeview1.SelectedNode.Tag;
基になるオブジェクトデータの一部をウィンドウに表示するNode
ontreeview1
をユーザーが選択するたびに実行されるメソッドがあります。Details
現在のところ、switchステートメントを含む単一のメソッドがあります。
private doSomething()
{
switch(treeview1.SelectedNode.Tag.GetType().Name)
{
case "dsMyDataSource.DepartmentRow":
dsMyDataSource.DepartmentRow department =
(dsMyDataSource.DepartmentRow)treeview1.SelectedNode.Tag;
lblDetailsTitle = department.Title;
break;
case "dsMyDataSource.JobRow":
//etc...
}
}
私がやりたいのは、タイプごとにオーバーロードされたメソッドを用意し、switchステートメントを削除することです。そのようです:
this.doSomething(treeview1.SelectedNode.Tag);
問題は、これがベースオブジェクト(つまりキャスト)を返すことです。しかし、コンパイル時に、ユーザーがどのタイプのTreeNodeを選択するかはわかりません。したがって、私は次のようなことができるようにしたいと思います。
this.doSomething((treeview1.SelectedNode.Tag.GetType())treeview1.SelectedNode.Tag);
private void doSomething(dsMyDataSource.DepartmentRow department)
{
lblDetailsTitle = department.Title;
// etc...
}
private void doSomething(dsMyDataSource.JobRow job) {..}
private void doSomething(dsMyDataSource.EmployeeRow employee) {..}
これは可能ですか?