C# 在类中创建多个属性级别

C# 在类中创建多个属性级别,c#,class,C#,Class,我曾经使用过一些API,这些API似乎是其他实体中方法的实例,但我还没有弄清楚如何为自己重新创建这些API。例如,如果我有一个名为“House”的类,并且该房屋中有不同的门,我想在其中一扇门中放置一个窗口,那么处理该实例的代码如下所示: House myHouse = New House; myHouse.Rooms("living room").Doors("front").PlaceWindow("frosted four pane"); 我希望我的陈述有意义。我已经在VB.Net中生活了

我曾经使用过一些API,这些API似乎是其他实体中方法的实例,但我还没有弄清楚如何为自己重新创建这些API。例如,如果我有一个名为“House”的类,并且该房屋中有不同的门,我想在其中一扇门中放置一个窗口,那么处理该实例的代码如下所示:

House myHouse = New House;
myHouse.Rooms("living room").Doors("front").PlaceWindow("frosted four pane");
我希望我的陈述有意义。我已经在VB.Net中生活了几个月,我们刚刚开始切换回C。我真的很好奇这个,这个,这个方面


我希望有一个这样易于使用和操作的对象,并且根据我目前的知识,我只能将属性和方法放在一个类中。我只是不知道应该在搜索引擎中搜索什么来找出如何创建这种类(或者它是什么类型的编译)。如果有人能把我引向正确的方向,那将大有裨益。

这种方法有一些危险;看

但是,如果希望这样做,只需使用希望拥有的子对象创建每个对象

对于您的示例,您可以创建以下内容:

public class House
{
    private readonly List<Room> _rooms = new List<Room>();

    public Room Rooms(string roomName)
    {
        return _rooms.Single(x => x.Name == roomName);
    }

    public void AddRoom(string roomName)
    {
        _rooms.Add(new Room { Name = roomName });
    }
}

public class Room
{
    private readonly List<Door> _doors = new List<Door>();

    public string Name { get; set; }

    public Door Doors(string doorName)
    {
        return _doors.Single(x => x.Name == doorName);
    }

    public void AddDoor(string doorName)
    {
        _doors.Add(new Door { Name = doorName });
    }
}

public class Door
{
    private readonly List<Window> _windows = new List<Window>();

    public string Name { get; set; }

    public Window Windows(string windowName)
    {
        return _windows.Single(x => x.Name == windowName);
    }

    public void PlaceWindow(string windowName)
    {
        _windows .Add(new Window { Name = windowName }); 
    }
}

public class Window
{
    public string Name { get; set; }
}
公共类房屋
{
私人只读列表_rooms=新列表();
公共房间(字符串roomName)
{
返回_rooms.Single(x=>x.Name==roomName);
}
public void AddRoom(字符串roomName)
{
_添加(新房间{Name=roomName});
}
}
公共教室
{
私有只读列表_doors=新列表();
公共字符串名称{get;set;}
公共门(字符串门名称)
{
返回_doors.Single(x=>x.Name==doorName);
}
public void AddDoor(字符串doorName)
{
_添加(新门{Name=doorName});
}
}
公共舱门
{
私有只读列表_windows=new List();
公共字符串名称{get;set;}
公共窗口(字符串windowName)
{
返回_windows.Single(x=>x.Name==windowName);
}
公共void PlaceWindow(字符串windowName)
{
_添加(新窗口{Name=windowName});
}
}
公共类窗口
{
公共字符串名称{get;set;}
}

这里有一种替代的模块化方法,可以更轻松地构建多层对象

public abstract class NamedObject
{
    public string Name { get; set; }
}

public class ComponentCollection<T> where T : NamedObject
{
    private readonly List<T> _components = new List<T>();

    public T this[string name]
    {
        get { return Get(name); }
    }

    public T Get(string name)
    {
        return _components.Single(x => x.Name == name);
    }

    public void Add(T component)
    {
        _components.Add(component);
    }

    public void Remove(string name)
    {
        _components.RemoveAll(x => x.Name == name);
    }
}

这种模式通常称为流畅的语法/接口。方法链接是构建流畅界面的技术方面。看一看,我只是想感谢大家的帮助。所有的洞察力都得到了充分的赞赏。我也一直在阅读链接,玩这个肯定是一种享受。大家好!
public class House
{
    public readonly ComponentCollection<Room> Rooms = new ComponentCollection<Room>();
}

public class Room : NamedObject
{
    public readonly ComponentCollection<Door> Doors = new ComponentCollection<Door>();
}

public class Door : NamedObject
{
    public readonly ComponentCollection<Window> Windows = new ComponentCollection<Window>();
}

public class Window : NamedObject
{
}
[TestMethod]
public void House_AddFrostedPaneWindowToLivingRoomFrontDoor_WindowExists()
{
    var myHouse = new House();
    myHouse.Rooms.Add(new Room { Name = "Living Room" });
    myHouse.Rooms["Living Room"].Doors.Add(new Door { Name = "Front" });
    myHouse.Rooms["Living Room"].Doors["Front"].Windows.Add(new Window { Name = "Frosted Four Pane" });

    var window = myHouse.Rooms["Living Room"].Doors["Front"].Windows["Frosted Four Pane"];

    Assert.IsNotNull(window);
}