繁体   English   中英

具有类数组的C#类

[英]C# class with array of classes

我上了下课;

public class Hotel
{
    public int Id { get; set; }
    public Room[] room { get; set; }

    public class Room
    {    
        public int RoomId { get; set; }
        public int RoomTypeId { get; set; }

        public string Name { get; set; }        
    }
}

我可以创建如下所示的类的实例,以便分配数据

Hotel oHotel = null;
oHotel = new Hotel ();
oHotel.Id = 100;

但是,如何为Room类创建一个子实例,我需要为Hotel类添加关联数据呢?

通过在其构造函数中为房间提供对酒店的引用。 但是酒店随后对房间一无所知,因此也要添加一个方法:

public class Hotel
{
    public int Id { get; set; }
    public List<Room> Rooms { get; set; }

    public void AddRoom(Room room)
    {
        Rooms.Add(room);
    }
}

public class Room
{    
    public Hotel Hotel { get; private set; }
    public int RoomId { get; set; }
    public int RoomTypeId { get; set; }

    public string Name { get; set; }        

    public Room(Hotel hotel)
    {
        this.Hotel = hotel;
    }
}

然后,您可以致电:

var hotel = new Hotel();

var room = new Room(hotel);

hotel.AddRoom(room);
public class Hotel
{
    public int Id { get; set; }
    public Room[] Rooms { get; set; }

    public void AddRoom(int id, int typeID, string name)
    {
        Room room = new Room(id, typeID, name);
        this.Rooms.Add(room);
    }

    public class Room
    {    
        public int RoomId { get; set; }
        public int RoomTypeId { get; set; }

        public string Name { get; set; }        

        public Room(int id, int typeID, string name)
        {
            RoomID = id;
            RoomTypeId = typeID;
            Name = name;
        }
    }
}

客户代码:

Hotel oHotel = null;
oHotel = new Hotel ();
oHotel.Id = 100;

oHotel.AddRoom(1, 1, "Name1"); 

结合使用数组和对象初始化程序语法,您可以在一条语句中完成所有操作,这完全适合于实例化POCO。

var oHotel = new Hotel
    {
        Id = 100
        room =
            {
                new Hotel.Room { RoomId = 1, RoomTypeid = 1, Name = "Name" }
            }
    };

如果要用多个房间初始化您的酒店,

var oHotel = new Hotel
    {
        Id = 100
        room =
            {
                new Hotel.Room { RoomId = 1, RoomTypeid = 1, Name = "A" },
                new Hotel.Room { RoomId = 2, RoomTypeid = 1, Name = "B" },
                new Hotel.Room { RoomId = 3, RoomTypeid = 2, Name = "C" },
                new Hotel.Room { RoomId = 4, RoomTypeid = 2, Name = "D" }
            }
    };

顺便说一句,您的

public Room[] room { get; set; }

属性,应该称为Rooms


如果您不想使用POCO(如您在问题中所显示的那样),我将像这样重写您的类,使其不可变,

public class Hotel
{
    private readonly int id;
    private readonly IList<Room> rooms;

    public Hotel(int id; IEnumerable<Room> rooms)
    {
        this.id = id;
        this.rooms = rooms.ToList();
    }

    public int Id
    {
        get { return this.id; }
    }

    public IEnumerable<Room> Rooms
    {
        get { return this.rooms; }
    }

    public class Room
    {
        private readonly int id;
        private readonly RoomType type;
        private readonly string name;

        public Room(int id, RoomType type, string name)
        {

        }

        public int Id
        { 
           get { return this.id; }
        }

        public RoomType Type
        {
            get { return this.type; }
        }

        public string Name
        {
           get { return this.name; }
        }
    }

    public enum RoomType
    {
        // Valid Room Types Here,
        // ...
    }
}

然后我会像这样实例化它

var oHotel = new Hotel(
    100,
    {
        new Hotel.Room(1, Hotel.RoomType..., "A"),
        new Hotel.Room(2, Hotel.RoomType..., "B"),
        new Hotel.Room(3, Hotel.RoomType..., "C"),
        new Hotel.Room(4, Hotel.RoomType..., "D") 
    });

仍然在一个语句中,但是更紧凑。 结果对象将是不可变的,这具有超出问题范围之外的许多好处。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM