静态(和嵌套!)类

时间:2012-04-01 12:52:17

标签: c# class static nested

我有一个代表游戏会话的课程,我希望有某种顺序,这样我就能做到这样的事情:

public class Session
{
    public static class Rooms
    {
        // All the things about session's rooms etc

        public static void Load()
        {
            // Load stuff...
        }
    }

    public static class Details
    {
        // All the session details (username, age...)
    }

    // etc
}

通过这种方式,一切都更有条理,每个嵌套类都可以处理特定的东西......

但是,当然,有一个问题......

当我有一个Session类的实例时,我尝试执行以下操作:

Session x = new Session();

x.Rooms.Load();

我收到如下错误:

  

无法通过表达式引用类型。请尝试'Program.Session.Rooms'。

请给我一些提示?

3 个答案:

答案 0 :(得分:0)

提示只是使用错误建议的内容:

Session.Rooms.Load();

解释:由于Session类型,即不是对象(类型的实例),并且包含嵌套的静态类型。因此,您仍然必须通过类型Session访问嵌套的静态类型,而不是通过Session的实例访问。

答案 1 :(得分:0)

由于它是静态类,您可以像这样访问它

Session.Rooms.Load();

编辑:根据您的评论,您可能应该更改此类结构

  

每个“Session”类代表一个不同的游戏会话,但每个   他们应该可以访问其他课程,“房间”,“详细信息

public class Session
{
  public Rooms SessionRooms { set;get;}
  public Details SessionDetails { set;get;}
}

public class Rooms
{
  public void Load() {}
}

public class Details()
{
}

这里每个Session对象都有自己的Rooms和Details。这些特定于那些Session对象。

现在你可以这样做

Session objSes=new Session();
objSes.Rooms.Load();

确保在访问子属性之前初始化它们(其他类)。否则,您将获得空引用异常。

编辑:根据您的评论,您想要访问Rooms类中的Details类。在这种情况下,我会将ParentSession属性添加到我的Rooms类中,如下所示

public class Rooms
{
  public Session ParentSession { set;get;}

  public Rooms(Session parent)
  {
    this.ParentSession=parent;
  }

  public void Load() {}
}

在SessionClass中,将父类对象传递给Rooms类的构造函数

public class Session
{
  public Rooms SessionRooms { set;get;}
  public Details SessionDetails { set;get;}

  public Session()
  {
    if(this.SessionRooms==null)
    {
      this.SessionRooms=new Room(this);
    }
    if(this.SessionDetails ==null)
    {
      this.SessionDetails =new Details(this);
    }
  }
}

您可以像这样从房间访问详细信息

Session objSes=new Session();
//do something...

Room theRool=objSes.Room;
//now to access the details like    
theRoom.ParentSession.SessionDetails

答案 2 :(得分:0)

错误几乎解释了它。 Rooms类与类型相关联,而不是与Session的实例相关联(Room是静态的)。您必须通过Session.Room.Load()等访问其功能。