Приведение System.Windows.Forms.Label к пользовательскому типу - PullRequest
3 голосов
/ 13 декабря 2010

У меня есть класс, который я наследую от System.Windows.Forms.Control

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

В основном этот класс добавляет еще несколько свойств к классу Controls по умолчанию. Моя проблема в том, что я не могу привести объекты Control в свои объекты управления. Поскольку класс customcontrol является производным от элементов управления, я подумал, что он может работать.

Я делаю кастинг вот так.

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

Здесь ctrl - это объект Label. Когда я отлаживаю первый кастинг работает нормально. (Control)ctrl часть. Но при отладке (CommonControl)((Control)ctrl) отображается следующее сообщение.

(CommonControl) (ctrl) Невозможно сотворить «Ctrl» (который имеет фактический тип 'System.Windows.Forms.Label') в SharpFormEditorDemo.CommonControl SharpFormEditorDemo.CommonControl

Ответы [ 2 ]

6 голосов
/ 13 декабря 2010

Вы не можете разыгрывать иерархии классов. 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
}

Затем создайте ctrl как MyLabel объект. Он наследуется от Label и принимает все методы интерфейса, определенные вашим классом. Если вам нужно разыграть его, бросьте его на ICommonControl.

Да, вам нужно создать подкласс для каждого класса управления, но это только одно решение, о котором я могу подумать.

1 голос
/ 13 декабря 2010

О Боже, ты знаешь, что делаешь? Ctrl является Label и определенно не находится в иерархии между CommonControl и Control. Вам следует изменить тип ctrl на свой пользовательский тип между иерархией CommonControl и Control, тогда он будет работать.

Приведение ctrl к Control определенно нормально, так как Label получен из Control. Однако приведение ctrl к CommonControl определенно неверно, поскольку ctrl никоим образом не имеет никакого отношения к CommonControl

Что вы можете сделать, это создать класс, производный от Label, и создать ctrl для создания объекта этого класса. И этот класс реализует интерфейс, который вы хотите.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...