运行时类型转换

本文关键字:类型转换 运行时 | 更新日期: 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也有类似的基本控件。