【问题标题】:Runtime Type Casting运行时类型转换
【发布时间】:2015-08-13 08:08:58
【问题描述】:

场景

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

当点击 panel-2 中的按钮时,它应该显示一个自定义控件(对于每个按钮单击,我想要显示不同的自定义控件)。

panel-2 中所有按钮的“名称”属性包含我的自定义控件的类型(从数据库中检索)。

这就是我在 panel-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”?

不需要

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

【问题讨论】:

    标签: c# winforms events casting


    【解决方案1】:

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

    【讨论】:

    • 在我的代码中我替换了:panel3.Controls.Add((Runtime Type)obj);通过 panel3.Controls.Add((System.Windows.Forms.Control)obj);按照建议。谢谢本!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2010-09-23
    • 2011-10-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多