将未知数 class 转换为其基数 class

Converting an unknown class to its base class

我正在 windows 表单中创建自定义工具箱(就像您在 VS 表单设计器中选择控件的工具箱)。要获取出现在控件文本一侧的图像,我使用的是:

ToolboxItem tbi = item as ToolboxItem;
var image = tbi.Bitmap;

其中 item 可以是任何类型的控件。一切正常。

当我尝试在工具箱中使用自定义控件时出现问题。假设我创建了这个 class:

public class PMLButton : Button
{
}

然后,当 PMLButton 传递给 'item' 变量时,它会获得自定义控件的齿轮图标,正如它应该的那样。但在这种情况下,我想显示该项目的默认按钮图标。

我将在工具箱中使用的所有工具都派生自默认 windows 控件 class(按钮、标签、复选框等)。

如果我将 'item' 变量转换为它的基本类型,它将正常工作并显示正确的图像。有什么办法吗?

ToolBoxItem 使用反射来获取类型,因此转换它不会改变其行为。

最简单的解决方案是自己分配工具箱位图:

[ToolboxBitmap(typeof(Button))]
public class PMLButton : Button
{
}

或者,如果包含位图的控件始终位于继承树的上一级,您可以使用:

var image = new ToolboxItem(item.GetType().BaseType).Bitmap;

不过我肯定会选择属性解决方案,因为 PMLButton 在设计器中也会有一个按钮位图。