0

私は次のクラスを持っています。

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;

しかし、Hotel クラスの関連データを追加する必要がある Room クラスのサブインスタンスを作成するにはどうすればよいでしょうか?

4

3 に答える 3

3

コンストラクターで部屋にホテルへの参照を与えることにより。ただし、ホテルは部屋について知らないため、そのためのメソッドも追加します。

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);
于 2013-06-21T11:09:36.833 に答える
0

配列とオブジェクト初期化子の構文を組み合わせることで、すべてを 1 つのステートメントで実行できます。これは、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") 
    });

まだ単一のステートメントですが、よりコンパクトです。結果のオブジェクトは不変になります。これには、質問の範囲を超えた多くの利点があります。

于 2013-06-21T11:24:53.693 に答える