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
您不能跨类层次结构进行转换.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)
然后创建ctrl为MyLabel对象.它继承Label并采用您的类定义的所有接口方法.如果你需要施放它,把它投射到ICommonControl.
是的,您需要为每个控件类创建子类,但这只是我能想到的一个解决方案.
| 归档时间: |
|
| 查看次数: |
680 次 |
| 最近记录: |