设想
在面板(例如面板1)中,当我单击一系列按钮中的一个按钮时,按钮将显示在另一个面板(例如面板2)中。
单击panel-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
}
}
问题
如何在运行时根据panel-2中单击的按钮转换'obj'的类型?
我不能使用:
Convert.ChangeType<T>();
我在想让上述方法起作用,该事件也应该是通用的,例如:
public void BtnClick<T>(object sender, EventArgs e)
那有可能吗?还有其他方法可以在运行时获取类型以相应地转换“ obj”吗?
不需要
我知道可以通过使用充足的case语句检查合适的类型(看起来不太优雅)的Switch语句来解决。
强制转换是编译时的事情,您在指示编译器忽略obj
声明的事实,object
因为您作为开发人员知道它实际上是一个窗体控件。但是,所有表单控件都共享一个基本类型,您可以将其强制转换为该基本类型System.Windows.Forms.Control
。Web表单和wpf有类似的基本控件。
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句