Преобразование Списка Базового типа к Списку Наследованного Типа

Облачный литейный плагин или как-то решает проблемы пользовательского интерфейса для микросервисов? PCF генерирует составной пользовательский интерфейс?

Нет, платформа не делает этого за вас. Он обрабатывает только запросы маршрутизации к вашим приложениям.

Около 12 Microservice будет отображать HTML, и теперь мы хотим знать, как мы можем объединить все эти службы в один пользовательский интерфейс и представить его клиенту.

Возможно, вы захотите использовать прокси-приложение перед вашими микросервисами. Прокси будет отвечать за представление единого интерфейса для ваших клиентов и объединение всех базовых сервисов вместе.

Netflix Zuul / Spring Cloud Zuul или Spring Cloud Gateway могут помочь в этом, если вы используете Java. Я также вижу, что люди используют Nginx в качестве обратного прокси-сервера для подобных вещей.

В конце дня вам нужно будет выяснить, что работает для ваших конкретных микросервисов & amp; приложения на стороне клиента, хотя. Я не думаю, что кто-то может дать вам окончательный ответ на ваш вопрос, по крайней мере, не намного больше информации.

19
задан stephenbayer 26 March 2009 в 17:12
поделиться

3 ответа

Если Вы имеете linq доступный, можно сделать

var ListOfA = ListOfB.Cast<A>().ToList();
30
ответ дан 30 November 2019 в 02:52
поделиться

Вы не можете сделать этого. Для понимания, почему это не позволяется вообразите то, что произошло бы если Add был обращен a List<Derived> после того, как это было брошено к a List<Base>.

Кроме того, ответы, подразумевающие, что C# 4.0 будет отличаться, являются неправильными. Список никогда не будет изменяться, чтобы позволить Вам делать это. Только IEnumerable будет - потому что это не позволяет объектам быть добавленными к набору.

Обновление: причина это работает в решении, для которого Вы пошли, состоит в том, потому что Вы больше не передаете тот же список. Вы создаете совершенно новый список, который является копией оригинала. Поэтому я спросил об изменении списка; если MethodC вносит изменения в количество объектов в списке, те изменения были бы внесены в копию, не исходный список.

Я думаю, что идеальное решение для Вас следующие:

public abstract class A
{
    public void MethodC<TItem>(List<TItem> list) where TItem : A
    {
        foreach (var item in list)
            item.CanBeCalled();
    }

    public abstract void CanBeCalled();
}

public class B : A
{
    public override void CanBeCalled()
    {
        Console.WriteLine("Calling into B");
    }
}

class Program
{
    static void Main(string[] args)
    {
        List<B> listOfB = new List<B>();

        A a = new B();

        a.MethodC(listOfB);
    }
}

Заметьте, как с этим решением можно передать a List<B> непосредственно к MethodC не будучи должен сделать то странное преобразование на нем сначала. Так никакое ненужное копирование.

Причина это работает, состоит в том, потому что мы сказали MethodC принять список чего-либо, что получено из A, вместо того, чтобы настоять, чтобы это был список A.

9
ответ дан 30 November 2019 в 02:52
поделиться

Вы обращаетесь к отсутствию ковариантности в текущей версии C#. Вот один способ сделать его:

listOfB.Cast<A>();
4
ответ дан 30 November 2019 в 02:52
поделиться
Другие вопросы по тегам:

Похожие вопросы: