将System.Windows.Forms.Label转换为自定义类型

JCT*_*TLK 3 c# casting winforms

我有一个类,我从System.Windows.Forms.Control派生

[Serializable]  
public class CommonControl : System.Windows.Forms.Control,IXmlSerializable 
{
Run Code Online (Sandbox Code Playgroud)

基本上这个类为默认的Controls类添加了一些属性.我的问题是我无法将Control对象强制转换为我的自定义控件对象.由于customcontrol类派生自Controls,我认为它可能有效.

我正在做这样的演员.

CommonControl ctrlTemp = new CommonControl();
ctrlTemp = (CommonControl)((Control)ctrl);
Run Code Online (Sandbox Code Playgroud)

这里的ctrl是一个Label对象.当我调试第一次铸造工作正常. (Control)ctrl部分.但是在(CommonControl)((Control)ctrl)调试时它会显示以下消息.

(CommonControl)(ctrl)无法将'ctrl'(其实际类型为'System.Windows.Forms.Label')转换为'SharpFormEditorDemo.CommonControl'SharpFormEditorDemo.CommonControl

Bol*_*ock 6

您不能跨类层次结构进行转换.Label并且CommonControl都继承自Control但是是不同的兄弟类,因此你不能将一个转换为另一个,甚至不能通过它们的父类.

或者更简单地说:一旦你创建了一个Label对象,它总是一个Label对象,即使你把它作为一个对象使用它Control.通过将它转换为CommonControl你完全改变它的类型,这在C#中是非法的.

也没有多重继承.作为一种变通方法,您可以创建一个接口,然后创建需要使用的控件的子类,这些控件都实现了自定义接口.一个快速而肮脏的例子:

public interface ICommonControl : System.Xml.Serialization.IXmlSerializable {
    // ...
}

[Serializable]
public class MyLabel : System.Windows.Forms.Label, ICommonControl {
    // Implement your common control interface and serializable methods here
}
Run Code Online (Sandbox Code Playgroud)

然后创建ctrlMyLabel对象.它继承Label并采用您的类定义的所有接口方法.如果你需要施放它,把它投射到ICommonControl.

是的,您需要为每个控件类创建子类,但这只是我能想到的一个解决方案.