运行时类型转换

可信

设想

在面板(例如面板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.ControlWeb表单和wpf有类似的基本控件。

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章