配列とオブジェクト初期化子の構文を組み合わせることで、すべてを 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")
});
まだ単一のステートメントですが、よりコンパクトです。結果のオブジェクトは不変になります。これには、質問の範囲を超えた多くの利点があります。