Вернуть разные типы объектов в заявлении case? - PullRequest
3 голосов
/ 25 апреля 2019

Как я могу вернуть различные типы объектов в моем операторе case?

    public object?? CreateObjectType(JToken token)
    {
        switch (token["type"].Value<string>())
        {
            case "Car":
                var Car = new Car();
                return car;

            case "Boat":
                var boat = new Boat();
                return boat;
            ..... 
        }
    }

Нужно ли создавать класс abstract / interface для этого?Примером этого было бы здорово.

Ответы [ 3 ]

4 голосов
/ 25 апреля 2019

Самый простой способ решить эту проблему - использовать интерфейс (на мой взгляд):

using System;

namespace Test
{
    public class Test
    {
        public IVehicle CreateObjectType(JToken token)
        {
            switch(token["type"].Value<string>())
            {
                case "Car":
                    return new Car();

                case "Boat":
                    return new Boat();

                default:
                    throw new NotImplementedException();
            }
        }
    }

    public class Boat : IVehicle { }

    public class Car : IVehicle { }

    public interface IVehicle { }
}

В качестве альтернативы, вы можете использовать некоторую форму цепочки наследования и использовать дженерики.

Дополнительно: Документация по интерфейсам

4 голосов
/ 25 апреля 2019

Похоже, вы реализуете базовый шаблон фабричного метода :

public interface IVehicle {}

public class Car : IVehicle {}
public class Boat : IVehicle {}

public IVehicle CreateObjectType(JToken token)
{
    switch (token["type"].Value<string>())
    {
        case "Car":
            return new Car();
        case "Boat":
            return new Boat();
        default:
          throw new ArgumentOutOfRangeException(nameof(token));
    }
}
0 голосов
/ 25 апреля 2019

Вы можете сделать: public IVehicle CreateObjectType(JToken token) или же public dynamic CreateObjectType(JToken token).

помните почти все dymanic требуется больше времени для запуска и компиляции.

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