运行时类型转换
本文关键字:类型转换 运行时 | 更新日期: 2023-09-27 18:07:54
场景
在一个面板(比如面板-1(中,当我从一系列按钮中单击一个按钮时,按钮会显示在另一个面板中(比如面板-2(。
当面板2中的按钮被点击时,它应该会显示一个自定义控件(每次点击按钮都有不同的自定义控件,我想显示(。
面板2中所有按钮的"Name"属性包含我的自定义控件的类型(从数据库检索(。
这就是我在面板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
}
}
问题
如何在运行时根据面板2中单击的按钮转换"obj"的类型?
我不能使用:
Convert.ChangeType<T>();
我认为,为了让以上内容发挥作用,事件也应该是通用的,比如:
public void BtnClick<T>(object sender, EventArgs e)
这可能吗?有没有其他方法可以在运行时获取类型以相应地强制转换"obj"?
不需要
我知道它可以通过Switch语句来解决,它有足够的case语句来检查正确的类型,这看起来并不优雅。
强制转换是编译时的事情,您指示编译器忽略obj
被声明为object
的事实,因为作为开发人员,您知道它实际上是一个表单控件。但是,所有表单控件都共享一个基类型,您可以直接转换为该System.Windows.Forms.Control
。web表单和wpf也有类似的基本控件。