Динамические объекты Вызывайте относительную функциональность везде, чтобы расширить библиотеку C # - PullRequest
0 голосов
/ 27 апреля 2018

У меня разные типы объектов в одном родительском классе " Control ". У меня есть Список , который, как я знаю, может иметь ссылки VideoControl, HtmlControl и т. Д. Все они являются «Control». Отладка также показывает, что приведение во время выполнения правильно анализирует их в относительный Control и присутствуют все другие специфические свойства.

Теперь эти объекты управления включены в два проекта, и я знаю, что используя signalR, я получу сериализованный список объектов управления нескольких типов.

Я хочу вызывать функцию Draw на каждом элементе управления, но мой проект Xamarin.Android знает, как Draw каждый элемент управления по-своему.

          foreach (Control control in listControls)
            {
                try
                {

                   control.Draw(this, myLayout);

                }
                catch (Exception ex)
                {
                }
            }

P.S. Draw определяется в интерфейсе, поэтому он применяется для каждого элемента управления. Моя проблема в том, что я хочу разрешить всем проектам расширять или предоставлять функции самостоятельно и рисовать каждый элемент управления с моими инкапсулированными данными.

Я много искал и нашел один возможный способ, например Методы расширения , но опять проблема в том, что мне нужно сделать явное приведение типа , что снова сделает мой код длинным и трудным для обработки ,

Для дополнительной помощи я добавляю свои методы Extension, если они могут обрабатываться без явного приведения типов.

    public static void Render(this Control Player, object context, object container)
    {
    }

    public static void Render(this VideoPlayer Player, object context, object container)
    {

    }
    public static void Render(this HTMLControl Player, object context, object container)
    {
    }
    public static void Render(this Button Player, object context, object container)
    {
    }

Если я не набираю приведение, то каждый раз мой метод расширения для Типа Control будет запускаться, но я хочу запустить относительный метод для каждого объекта.

Каким будет возможный способ справиться с этим: какая-то частичная реализация или некоторые методы расширения или каким-либо другим способом.

1 Ответ

0 голосов
/ 27 апреля 2018

Для этого вы должны использовать обычную функцию ООП. У вас есть интерфейс управления:

public interface IControl
{
    void Draw();
}

и абстрактный базовый класс:

public abstract class Control
{
    // Use abstract if you don't want to have a default
    // Draw() method in the base Control:
    public abstract void Draw();

    // Use abstract if you do want to have a default
    // Draw() method in the base Control:
    public virtual void Draw()
    {
        // basic drawing code here
    }
}

и тогда у вас есть производный класс:

public class Button : Control
{
    public override void Draw()
    {
        // custom drawing code here
    }
}

и, наконец, использовать его:

List<IControl> controls = new List<IControl>();
controls.Add(new Button());
controls.Add(new Player());
controls.Add(new Image());

foreach (IControl control in controls)
{
    control.Draw();
}
...