我已经阅读了许多试图完成类似任务的帖子,但找不到解决我问题的正确方法。
我正在尝试在运行时动态转换对象。(我知道你们很多人会说它不能完成,我实际上不确定它是否可以......)我的问题是我在 a 中动态创建TreeView
了一个Windows Forms Application
来显示一个Org Chart
.
从 3 个表中TreeView
提取的数据:Departments
、Jobs
、Employees
。
Tables
作为 a导入,Local DataSource
我将所有 3 个表作为DataSet
对象,并将对象类型的模板DataRow
转换为它来自的表(包括作为属性的所有列)。(类似于 linq - Oracle DB 除外)
我创建TreeNode
对象,使用我的描述字段DataRow
作为TreeNode.Text
属性,然后将其DataRow
本身作为TreeNode.Tag
属性。这样,我可以通过以下方式直接从内部访问数据TreeNode
:
dsMyDataSource.DepartmentRow =
(dsMyDataSource.DepartmentRow)treeview1.SelectedNode.Tag;
我有一个方法,只要用户选择一个填充一个带有一些基础对象数据的窗口Node
的方法,它就会运行。截至目前,我有一个带有 switch 语句的方法,如下所示:treeview1
Details
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) {..}
这可能吗?