Если у меня есть следующий код, и я хочу перебрать список транспортных средств и отобразить цену, как я могу получить доступ к этому свойству?

    public class Vehicle
    {
        public string Name { get; set; }
        public string Price { get; set; }
    }

    public class ElectricalDriven : Vehicle
    {
        public string SuperChargerCord { get; set; }
    }

    public class GasolinDriven : Vehicle
    {
        public string GasolineTank { get; set; }
    }

        var myListOfVechicles = new List<Vehicle>();
        myListOfVechicles.Add(new ElectricalDriven { Name = "Tesla", Price = "100 000", SuperChargerCord = "Yellow cord"});
        myListOfVechicles.Add(new GasolinDriven { Name = "Ford", Price = "50 000", GasolineTank = "Large VZ Tank"});


        foreach (var row in myListOfVechicles)
        {
            Console.WriteLine($"- {row.Name}");
        }
0
MTplus 8 Сен 2016 в 17:10

3 ответа

Лучший ответ

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

 public class Vehicle
{
    public string Name { get; set; }
    public virtual string GetCustomProperty() { return string.Empty; }
}

public class ElectricalDriven : Vehicle
{
    public string ElectricalVehicleProperty { get; set; }
    public override string GetCustomProperty() { return ElectricalVehicleProperty; }
}

public class GasolinDriven : Vehicle
{
    public string GasolinVehicleProprety { get; set; }
    public override string GetCustomProperty() { return GasolinVehicleProprety; }
}
class Program
{
    static void Main(string[] args)
    {
        var myListOfVechicles = new List<Vehicle>();
        myListOfVechicles.Add(new ElectricalDriven { Name = "Tesla", ElectricalVehicleProperty = "100 000" });
        myListOfVechicles.Add(new GasolinDriven { Name = "Ford", GasolinVehicleProprety = "50 000" });

        foreach (var row in myListOfVechicles)
        {
            Console.WriteLine("Price: " + row.GetCustomProperty()); //will output 100,000 and 50,000
        }
        Console.Read();
    }
}
0
Innat3 8 Сен 2016 в 14:50

В foreach вы можете проверить, является ли текущая «строка» ElectricalDriven или GasolinDriven с оператором «is», а затем преобразовать строку в согласованную конкретную реализацию. Должно быть что-то вроде этого:

if (row is ElectricalDriven)
{
    Console.WriteLine($"Price: {((ElectricalDriven)row).Price}");
}
else if (row is GasolinDriven)
{
    Console.WriteLine($"Price: {((GasolinDriven)row).Price}");
}

Однако видно, что чем больше разных автомобилей, тем больше «если». Вероятно, вам следует переместить свойство price в базовый класс или в интерфейс.

РЕДАКТИРОВАТЬ: увидев, что автор переместил свойство price в класс Vehicle, теперь вы можете получить к нему доступ так же, как вы получили доступ к свойству Name.

0
vmutafov 8 Сен 2016 в 14:49

Делая это:

var myListOfVechicles = new List<Vehicle>();
myListOfVechicles.Add(new ElectricalDriven { Name = "Tesla", Price = "100 000" });
myListOfVechicles.Add(new GasolinDriven { Name = "Ford", Price = "50 000" });

Компилятор назначит объект подкласса (например, ElectricalDriven) объекту базового класса (Автомобиль) after , неявно преобразовав его в тип базового класса.

Из-за этого преобразования знайте, что когда вы пытаетесь получить доступ к этому объекту, вы обращаетесь к объекту, который имеет только члены базового класса, то есть только Name.

Чтобы получить доступ к Price, вам необходимо явно привести объект к типу подкласса перед доступом к его членам. Самый простой пример, вы можете попробовать это:

   string name, price;
    foreach (var item in myListOfVechicles)
    {
        name = item is ElectricalDriven ? 
                       (item as ElectricalDriven).Name : 
                       (item as GasolinDriven).Name;
        price = item is ElectricalDriven ? 
                        (item as ElectricalDriven).Price :
                        (item as GasolinDriven).Price;

        Console.WriteLine($"Name: {name} - Price: {price}");
    }
0
Wael Alshabani 8 Сен 2016 в 14:55