运行时类型转换

时间:2015-08-13 08:08:59

标签: c# winforms events casting

方案

在一个面板(比如面板-1)中,当我从一系列按钮中单击一个按钮时,按钮会显示在另一个面板中(比如面板-2)。

当单击面板-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
            }

    }

问题

如何转换' obj'在运行时取决于在面板-2中单击的按钮?

我无法使用:

Convert.ChangeType<T>();

我认为上述工作事件也应该是通用的,例如:

public void BtnClick<T>(object sender, EventArgs e)

这甚至可能吗? 有没有其他方法可以在运行时获取类型来转换&#39; obj&#39;相应?

不需要

我知道可以通过Switch语句解决这个问题,并使用大量的case语句检查正确的类型,看起来并不优雅。

1 个答案:

答案 0 :(得分:1)

Casting是一个编译时间,你指示编译器忽略obj被声明为object的事实,因为你作为开发人员知道它实际上是一个表单控件。但是,所有表单控件都共享一个基本类型,您可以转换为System.Windows.Forms.Control。 Web表单和wpf有类似的基本控件。