“x.Groups = list”有效,但“x.Groups.Add(listItem)”会抛出空引用异常吗?

时间:2012-05-23 16:54:59

标签: c# asp.net oop

我有一个名为Permissions的类,它有一些子类(和一些属性),GroupGroup.Permission

现在,我 CAN 执行以下操作

Permissions u = new Permissions();
u.userId = (Guid)user.ProviderUserKey;
List<int> groups = getGroupsForUserId(u.userId.ToString());

List<Permissions.Group> groupItems = new List<Permissions.Group>();

foreach (int g in groups)
{
    Permissions.Group groupItem = new Permissions.Group();
    groupItem.group_id = g;
    groupItem.Records = getRecordsForGroupId(g);
    groupItem.Permissions = getPermissionsForGroupId(g);

    groupItems.Add(groupItem);
}
u.Groups = groupItems;

但是, CAN NOT 执行此操作:

Permissions u = new Permissions();
u.userId = (Guid)user.ProviderUserKey;
List<int> groups = getGroupsForUserId(u.userId.ToString());

foreach (int g in groups)
{
    Permissions.Group groupItem = new Permissions.Group();
    groupItem.group_id = g;
    groupItem.Records = getRecordsForGroupId(g);
    groupItem.Permissions = getPermissionsForGroupId(g);

    u.Groups.Add(groupItem);
}

我的问题, 为什么?

我创建了一个新的Permissions.Group对象,添加了值,然后将其添加到u对象的Groups列表中。在我看来应该有用,但是我想我在课堂上没有连线?我的班级只是一个属性列表property_name { get; set; }所以真的没什么异国情调。

尝试后者,我在NullReferenceException

行上得到u.Groups.Add(groupItem);

4 个答案:

答案 0 :(得分:4)

您可能需要在Permissions.Groups构造函数中初始化Permissions

public class Permissions
{
    public Permissions()
    {
         Groups = new List<Group>();
    }

    public ICollection<Group> Groups { get; set; }
}

答案 1 :(得分:1)

在第二个示例中,我的资金是您未在Permissions对象中初始化Groups集合。因此,实际上,您正在尝试将组项添加到空组集合中。

答案 2 :(得分:1)

因为您还没有实例化User.Groups,它仍然是null。在User的构造函数中或在实例化User之后,您还必须实例化Groups属性/字段。

public class Permissions
{
    public List<Premissions.Group> Groups { get; set; }
    ...
    public Permissions()
    {
        Groups = new List<Permissions.Group>();
    }
}

OR

Permissions user = new Permissions();
user.Groups = new List<Permissions.Group>();

OR

public class Permissions
{
    private List<Permissions.Group> _groups = new List<Permissions.Group>();
    public List<Permissions.Group> Groups { get { return _groups; } set { _groups = value; } }
}

答案 3 :(得分:1)

您需要在权限构造函数中初始化组。

或者,如果您不想修改构造函数,可以使用object initializer

示例:

更改     权限u =新权限();

Permissions u = new Permissions(){Groups = new List<Permissions.Group>()};

在对象初始值设定项中,将组初始化为空列表。