方案
在一个面板(比如面板-1)中,当我从一系列按钮中单击一个按钮时,按钮会显示在另一个面板中(比如面板-2)。
当单击面板-2中的按钮时,它应显示一个自定义控件(对于每个按钮单击,我都要显示不同的自定义控件。)
'姓名'面板-2中所有按钮的属性包含我的自定义控件的类型(从数据库中检索)。
这是我的实现如何用于面板-2中的按钮点击事件:
public void BtnClick(object sender, EventArgs e)
{
ButtonItem btnAtomic = sender as ButtonItem;
if (btnAtomic != null)
{
Type type = Type.GetType(btnAtomic.Name, true, true);
object obj = Activator.CreateInstance(type);
type.GetProperty("Dock")
.SetValue(obj, DockStyle.Fill, null);
// following is the line where I'm stuck:
panel3.Controls.Add((*Runtime Type*)obj);
//
}
else
{
// log custom error tht its not a buttonItem
}
}
问题
如何转换' obj'在运行时取决于在面板-2中单击的按钮?
我无法使用:
Convert.ChangeType<T>();
我认为上述工作事件也应该是通用的,例如:
public void BtnClick<T>(object sender, EventArgs e)
这甚至可能吗? 有没有其他方法可以在运行时获取类型来转换&#39; obj&#39;相应?
不需要
我知道可以通过Switch语句解决这个问题,并使用大量的case语句检查正确的类型,看起来并不优雅。
答案 0 :(得分:1)
Casting是一个编译时间,你指示编译器忽略obj
被声明为object
的事实,因为你作为开发人员知道它实际上是一个表单控件。但是,所有表单控件都共享一个基本类型,您可以转换为System.Windows.Forms.Control
。 Web表单和wpf有类似的基本控件。