如何在c#中将子类数据添加到我的数组中

时间:2018-05-22 19:35:43

标签: c#

例如,我有一个继承自Vehicles的公共类MobileObjectsVehicles班级有10meters23meters12meters作为数据。

我如何将该信息添加到此数组?

static void Main(string[] args) {
    Console.WriteLine("hello");
    MobileObjects[] array = new MobileObjects[3];

    MobileObjects mob = new MobileObjects();
    mob.setName("Jawaharal");
    mob.setPosition();
    mob.getID();
    array[0] = mob;

    MobileObjects mob1 = new MobileObjects();
    mob1.setName("Willow");
    mob1.setPosition();
    array[1] = mob1;

    MobileObjects mob2 = new MobileObjects();
    mob2.setName("Indira");
    mob2.setPosition();
    array[2] = mob2;

    foreach (MobileObjects host in array) {
        Console.WriteLine("Name : " + host.Name + " ");
        Console.WriteLine("ID   : " + host.id);
        Console.WriteLine("Position: " +
            host.Position[0] + " " +
            host.Position[1] + " " +
            host.Position[2]);
    }
}

4 个答案:

答案 0 :(得分:0)

您可以将Vehicle实例强制转换为MobileObject,然后将其添加到数组中。 (在所有情况下,这不是必要的强制转换,但根据您的Vehicle和MobileObjects类的属性,可能是您所需要的)

Vehicle veh1 = new Vehicle();
/// Add veh1 parameters
array[3] = (MobileObjects)veh1;

注意:由于您将实例转换为其基类,因此您现在应该只能在查看数组[3]项时访问共享参数。

答案 1 :(得分:0)

最简单的答案是使用C#泛型集合,如Array或List和auto属性。

您可以在此处找到有关收藏的信息:

https://docs.microsoft.com/en-us/dotnet/csharp/programming-guide/concepts/collections

有关自动属性的信息如下:

https://docs.microsoft.com/en-us/dotnet/csharp/programming-guide/classes-and-structs/auto-implemented-properties

似乎你想坚持使用getter和setter。为了与您当前的约定保持一致,您可以使用SetAt方法。

array[0].SetPositionAt(0, 10);
array[0].SetPositionAt(1, 23);

但是,要执行此操作,您需要在MobileObject中分配空间。

public class MobileObject 
{
    private int[] _position;

    public MobileObject() 
    {
        Position = new int[3]; 
    }

    public void SetPositionAt(int idx, int value) 
    {
        _position[idx] = value;
    }

    public int GetPositionAt(int idx)
    {
        return _position[idx];
    }
}

然后你会得到这样的信息:

host.GetPositionAt(0)

答案 2 :(得分:0)

首先让我重申我所想的你要问的内容:

  

如何判断数组中的对象是baseClass类型还是derivedClass类型,以便在适用时显示derivedClass的属性?< / p>

如果这是正确的,一种方法是使用is关键字检查当前项是否是特定类型,并使用as关键字来获取该类型的对象(有额外的属性):

if (someArrayItem is DerivedClass)
{
    DerivedClass itemAsDerived = someArrayItem as DerivedClass;

    Console.WriteLine(itemAsDerived.SomeDerivedProperty);
}

这是一种使用一些简单示例的方法(因为您没有提供要使用的类,我将在这里创建自己的,我们有一个公共基类Vehicle,以及两个派生类他们自己独特的属性):

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

public class Car : Vehicle
{
    public int SeatCount { get; set; }
}

public class Truck : Vehicle
{
    public double CargoCapacity { get; set; }
}

现在我们可以将这些项目的混合添加到List<Vehicle>

private static void Main()
{
    var vehicles = new List<Vehicle>
    {
        new Vehicle {Name = "Vehicle", Color = Color.Blue},
        new Truck {Name = "Pickup Truck", Color = Color.Red, CargoCapacity = 12.4},
        new Car {Name = "SUV", Color= Color.Purple, SeatCount = 7}
    };

    foreach (Vehicle vehicle in vehicles)
    {
        Console.Write("This item is a: " + vehicle.Color.Name + " " + vehicle.Name);

        if (vehicle is Truck)
        {
            // It's a truck so create a truck from it and show the truck properties
            Truck truck = vehicle as Truck;

            Console.Write(" with cargo capacity of " + truck.CargoCapacity +
                          " square feet.");
        }
        else if (vehicle is Car)
        {
            // It's a car so create a car from it and show the car properties
            Car car = vehicle as Car;

            Console.Write(" with seating for " + car.SeatCount + " people");
        }

        Console.WriteLine();
    }

    GetKeyFromUser("\nDone! Press any key to exit...");
}

<强>输出

enter image description here

答案 3 :(得分:0)

从您的描述中很难知道您需要什么。我希望我理解得很好。

首先 - 在其他答案中,大部分时间使用List都优于数组。

这是一段代码:

using System;

namespace NamedTuple
{
    class Program
    {
        static void Main(string[] args)
        {
            MobileObject[] mobileObjects = new MobileObject[3];
            // insert MobileObject
            MobileObject mob1 = new MobileObject()
            {
                Name = "Jawahara",
                Position = (12, 15),
                Id = 123456
            };
            mobileObjects[0] = mob1;

            //Insert Vehicle
            Vehicle veh = new Vehicle()
            {
                Name = "Willow",
                Position = (14, 13),
                Id = 6549879,
                Length = 23
            };
            mobileObjects[1] = veh;

            //Insert another vehicle
            mobileObjects[2] = new Vehicle()
            {
                Name = "Indira",
                Position = (14, 13),
                Id = 885298451,
                Length = 12
            };

            foreach (var mobileObject in mobileObjects)
            {
                Console.WriteLine($"Name: {mobileObject.Name}, " +
                    $"Position: {mobileObject.Position.X };{mobileObject.Position.Y}, " +
                    $"Id: {mobileObject.Id}");

                if(mobileObject is Vehicle)
                {
                    Console.WriteLine($"Length: {((Vehicle)mobileObject).Length}");
                }
            }
        }
    }

    public class MobileObject
    {
        public string Name { get; set; }
        public (int X, int Y) Position { get; set; }
        public int Id { get; set; }
    }

    public class Vehicle : MobileObject
    {
        public int Length { get; set; }
    }
}