如何将对象添加到另一个对象内的列表(或其他集合)?

时间:2011-04-22 08:44:36

标签: wcf linq

我有这个:

    public class Room
{
    public string RoomID { get; set; }
    public string RoomName { get; set; }
    public List<User> UsersInRoom { get; set; }

    //public IDuplexClient RoomCallbackChannel { get; set; }
}

正如您所看到的,有一个包含房间用户的列表。

但实际上要让它工作我需要添加用户,所以我这样做了:

            User usr;
        Room roomi;
        if (userNameTest == null)
        {
            lock (_clients)
            {
                usr = new User { UserID = sessionID, CallbackChannel = client, UserName = userName };
                roomi = new Room();
                roomi.RoomID = sessionID;
                roomi.RoomName = room;
                roomi.UsersInRoom.Add(usr);
                //roomi.UsersInRoom.Add(usr);
                _rooms.Add(roomi);
                //_clients.Add(usr);
            }
        }

并且在行:

roomi.UsersInRoom.Add(usr);

我得到NullReferenceException。 发生了什么事?

3 个答案:

答案 0 :(得分:3)

您尚未创建列表 - 因此roomi.UsersInRoom为空。

您可以通过将行更改为:

来解决此问题
roomi.UsersInRoom = new List<User>();
roomi.UsersInRoom.Add(usr);

请注意,如果您使用的是C#3或更高版本,则可以使用对象和集合初始值设定项使所有此代码更简单。此外,您可以将UsersInRoom设置为只读属性,将值设置为Room构造函数(或变量初始值设定项)中的新列表。

不幸的是我现在没有时间展示所有这些内容,但对于对象/集合初始化程序来说是这样的:

_rooms.Add(new Room {
    RoomId = sessionId,
    RoomName = room,
    UsersInRoom = new List<User> { 
        new User { 
            UserID = sessionID,
            CallbackChannel = client,
            UserName = userName
        }
    }
});

如果您更改它以便{Room}本身初始化UsersInRoom,则会更改为:

_rooms.Add(new Room {
    RoomId = sessionId,
    RoomName = room,
    UsersInRoom = { 
        new User { 
            UserID = sessionID,
            CallbackChannel = client,
            UserName = userName
        }
    }
});

答案 1 :(得分:1)

List<T>,是一种参考类型。引用类型的默认值为null

在开始向其添加项目之前,您需要初始化列表。

roomi.UsersInRoom=new List<User>();

答案 2 :(得分:1)

您确定List已初始化吗? List是一个对象,所以你必须“创建”它,如下所示:

List<User> nameOfList = new List<User>();