Invalid Cast из UserControl в пользовательский элемент управления - PullRequest
3 голосов
/ 27 февраля 2011

У меня есть несколько элементов управления, которые все наследуются от UserControl, и у меня есть метод MergeSort, который работает на типах UserControl (чтобы избавить меня от написания 6 различных методов), но когда я приведу обратно к своему пользовательскому контролирует после сортировки, выдает ошибку, что я делаю не так? Для метода mergesort требуется свойство Left, которое используется каждым пользовательским элементом управления, поэтому есть ли другой способ сделать это?

Метод MergeSort выглядит следующим образом:

public UserControl[] MergeSort(UserControl[] array)

В ролях выглядит:

(CustomControl[])MergeSort(customControlArray);

Ответы [ 2 ]

2 голосов
/ 27 февраля 2011

Я думаю, вы должны разыграть каждого из них вручную:

CustomControl[] customControlArray;
...
UserControl[] sortedControls = MergeSort(customControlArray);
CustomControl[] sortedCustomControls = Array.ConvertAll<UserControl, CustomControl>(sortedControls, delegate(UserControl control)
{
    return (CustomControl)control;
});

Если у вас есть .NET 3.5+ в вашем распоряжении, вы можете использовать гораздо более «крутой» синтаксис.:)

Редактировать: синтаксис кулера:

UserControl[] sortedControls = customControlArray.ToList().ConvertAll(c => (CustomControl)c).ToArray();

: -)

2 голосов
/ 27 февраля 2011

(я удалил свой предыдущий ответ, потому что я думаю, что он на самом деле был неверным.)

Похоже, вам нужна абстракция между вашими элементами управления и UserControl, которая представляет общую функциональность. Есть два основных способа сделать это, и какой из них вы используете, это вопрос личных предпочтений кодирования, как вы планируете их расширять, как вы организовываете свой код в проекте и т. Д. *

  1. Наследовать от базового класса. По сути, создайте класс MyCustomControl (или как вы хотите его назвать), который реализует общую функциональность между вашими пользовательскими элементами управления. Это наследуется от UserControl, а ваши элементы управления наследуются от этого. Тогда ваш метод будет ожидать / вернуть массив этого базового класса.
  2. Реализация интерфейса. Вы можете создать интерфейс ICustomControl (или как вы хотите его назвать), который представляет общую функциональность ваших пользовательских элементов управления. Тогда ваши элементы управления наследуются от UserControl, а также реализуют ICustomControl. Тогда ваш метод будет ожидать / вернуть массив этого типа интерфейса.

Я лично предпочитаю интерфейсный подход. Наследование имеет тенденцию быть чрезмерно используемым во многих объектно-ориентированных кодах людей, и на самом деле не должно быть. Интерфейс лучше представляет абстракцию (или контракт кода) как тип (в отличие от класса). Но это гораздо большая дискуссия в другой раз, я полагаю:)

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