Вы не можете разыгрывать иерархии классов. 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
.
Да, вам нужно создать подкласс для каждого класса управления, но это только одно решение, о котором я могу подумать.