C# 将System.Windows.Forms.Label强制转换为自定义类型

C# 将System.Windows.Forms.Label强制转换为自定义类型,c#,winforms,casting,C#,Winforms,Casting,我有一个从System.Windows.Forms.Control派生的类 [Serializable] public class CommonControl : System.Windows.Forms.Control,IXmlSerializable { 基本上,这个类向默认控件类添加了更多的属性。 我的问题是无法将控件对象强制转换为自定义控件对象。因为customcontrol类是从控件派生的,所以我认为它可能会工作 我是这样做的 CommonControl ctrlTemp =

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

[Serializable]  
public class CommonControl : System.Windows.Forms.Control,IXmlSerializable 
{
基本上,这个类向默认控件类添加了更多的属性。 我的问题是无法将控件对象强制转换为自定义控件对象。因为customcontrol类是从控件派生的,所以我认为它可能会工作

我是这样做的

CommonControl ctrlTemp = new CommonControl();
ctrlTemp = (CommonControl)((Control)ctrl);
这里,ctrl是一个标签对象。当我调试第一个铸件时,效果很好。
(控制)ctrl
零件。但是当调试
(CommonControl)((Control)ctrl)
时,它会显示以下消息

(CommonControl)(ctrl)无法强制转换 “ctrl”(实际类型为 “System.Windows.Forms.Label”)到 “SharpFormEditorDemo.CommonControl”SharpFormEditorDemo.CommonControl


天哪,你知道你在做什么吗? ctrl是一个标签,它肯定不在CommonControl和Control之间的层次结构中。 您应该在CommonControl和Control hierarchy之间将ctrl类型更改为用户定义类型,这样它就可以工作了

将ctrl强制转换为Control肯定是可以的,因为标签是从Control派生的。但是,将ctrl强制转换为CommonControl肯定是错误的,因为ctrl与CommonControl没有任何关系


您可以做的是创建一个从Label派生的类,并按ctrl键创建该类的对象。并且该类正在实现您想要的接口。

您不能跨类层次结构强制转换
Label
CommonControl
都继承自
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
}
然后创建
ctrl
作为
MyLabel
对象。它继承自
Label
,并采用类定义的所有接口方法。如果需要强制转换,请将其强制转换为
ICommonControl


是的,您需要对每个控件类进行子类化,但这只是我能想到的一个解决方案。

“哦,天哪,您知道自己在做什么吗?”-没有必要这样做@杰夫-竖起大拇指:)尽管我重视所有的答案。。顺便说一句,我做了一件有点愚蠢的事…:D谢谢大家。很抱歉这么粗鲁。。。我很抱歉。。。但实际上,你可以挑选一两本关于C#中面向对象编程的书,希望它能帮助你理解为什么是OO,并帮助你设计程序的OO。基本上,在您的情况下,您还可以创建一个接受任何控制对象的类,然后使用is运算符检查实际类型,并基于该类进行序列化。。。再一次抱歉…我把这个投了高票,尽管第一句话我有点畏缩。你在正确的轨道上,你其余的解释没有错。我甚至有和你一样的最初反应,但我知道在这里回答问题时,我们最好尽量克制自己的惊讶有很多。我应该考虑一下类的层次结构。