【发布时间】:2015-08-13 08:08:58
【问题描述】:
场景
在一个面板(比如 panel-1)内,当我从一系列按钮中单击一个按钮时,按钮会显示在另一个面板(比如 panel-2)中。
当点击 panel-2 中的按钮时,它应该显示一个自定义控件(对于每个按钮单击,我想要显示不同的自定义控件)。
panel-2 中所有按钮的“名称”属性包含我的自定义控件的类型(从数据库中检索)。
这就是我在 panel-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
}
}
问题
如何根据在 panel-2 中单击的按钮在运行时转换“obj”的类型?
我不能使用:
Convert.ChangeType<T>();
我正在考虑使上述工作的事件也应该是通用的,例如:
public void BtnClick<T>(object sender, EventArgs e)
这可能吗? 有没有其他方法可以在运行时获取类型以相应地转换“obj”?
不需要
我知道这可以通过 Switch 语句来解决,用大量的 case 语句检查看起来不优雅的正确类型。
【问题讨论】:
标签: c# winforms events casting