2010-12-13 6 views
3

Je vais avoir une classe où je suis provenant de System.Windows.Forms.Controlcasting System.Windows.Forms.Label à un type personnalisé

[Serializable] 
public class CommonControl : System.Windows.Forms.Control,IXmlSerializable 
{ 

Fondamentalement, cette classe ajoute quelques autres propriétés à la default Controls classe. Mon problème est que je ne peux pas convertir les objets Control dans mes objets de contrôle personnalisés. Étant donné que la classe customcontrol est dérivée des contrôles, j'ai pensé que cela pourrait fonctionner.

Je fais le casting comme ça.

CommonControl ctrlTemp = new CommonControl(); 
ctrlTemp = (CommonControl)((Control)ctrl); 

Ici, le ctrl est un objet Label. Quand je débogue la première coulée fonctionne bien. (Control)ctrl partie. Mais lorsque le (CommonControl)((Control)ctrl) est débogué, il affiche le message suivant.

(CommonControl) (ctrl) ne peut pas jeter 'ctrl' (qui a un type réel de 'System.Windows.Forms.Label') à SharpFormEditorDemo.CommonControl 'SharpFormEditorDemo.CommonControl'

Répondre

6

Vous ne pouvez pas convertir les hiérarchies de classes. Label et CommonControl héritent tous les deux de Control mais sont des classes de fratries distinctes, et donc vous ne pouvez pas passer l'un à l'autre, même par leur parent.

Ou pour le dire plus simplement: une fois que vous créez un objet Label, il s'agit toujours d'un objet Label même si vous le transtypez pour l'utiliser comme Control. En le transformant en CommonControl, vous changez complètement son type, ce qui est illégal en C#.

Il n'y a pas d'héritage multiple non plus. Pour contourner ce problème, vous pouvez créer une interface, puis créer des sous-classes des contrôles à utiliser pour implémenter votre interface personnalisée. Un exemple rapide et sale:

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 
} 

créant ensuite ctrl comme un objet MyLabel. Il hérite de Label et adopte toutes les méthodes d'interface définies par votre classe. Si vous avez besoin de le lancer, placez-le dans un ICommonControl. Oui, vous devez sous-classer chaque classe de contrôle, mais ce n'est qu'une solution à laquelle je peux penser.

+0

Thnx beaucoup. J'aurais dû considérer la hiérarchie des classes. – JCTLK

1

Oh mon Dieu, savez-vous ce que vous faites? ctrl est Label et certainement il n'est pas dans la hiérarchie entre CommonControl et Control. Vous devez changer le type de ctrl à votre type de définir l'utilisateur entre CommonControl et la hiérarchie de contrôle, alors cela fonctionnera.

Coulée ctrl à Control est définitivement correct, puisque Label est dérivé de Control. Cependant, la conversion de ctrl en CommonControl est définitivement fausse, puisque ctrl n'a aucun lien avec CommonControl

Ce que vous pouvez faire est de créer une classe dérivée de Label, et de faire ctrl pour créer un objet de cette classe. Et cette classe met en œuvre l'interface que vous voulez.

+0

"Oh mon Dieu, savez-vous ce que vous faites?" - Il n'y a pas besoin de ça! –

+0

@geoff - Thumbs Up :) Même si j'apprécie toutes les réponses .. BTW c'est une chose un peu stupide que j'ai fait ...: D Thnx tout le monde. – JCTLK

+0

désolé d'être impoli ... je suis désolé ... mais en fait vous pouvez prendre 1 ou 2 livres sur la programmation orientée objet en C#, espère qu'il peut vous aider à comprendre pourquoi OO et vous aider dans la conception OO de votre programme. Fondamentalement dans votre cas, vous pouvez également créer une classe qui accepte tout objet Control puis vérifier le type réel en utilisant l'opérateur, et faire une sérialisation basée sur cela ... désolé encore ... –