3

我有这门课

public class User
{
   private string _name;
   public string UserName { get; set; }       
   public List<int> ControlNumber { get; set; }
   public User (string username)
   {
       _name = username;
   }
   public User()
   {
   }

}

而这个填充类的功能。

User UserClass = new User(e.Key); //e.Key = user's name

public static void FillUserListClass(DataTable dt, ref UserClass)

{
    try
    {

        for (int ctr = 0; ctr < dt.Rows.Count; ctr++)
        {
            var row = dt.Rows[ctr];
            var userName = row["User"].ToString();

            if (UserList.ContainsKey(userName))
            {
                UserList[userName].Add(Convert.ToInt32(row["ControlNumber"]));
            }
            else
            {
                _user.UserName = row["User"].ToString();
                _user.ControlNumber.Add(Convert.ToInt32(row["ControlNumber"]));

            }
              //print out
            Console.WriteLine("UserList Class: ");
            Console.WriteLine(_user.UserName);
            Console.WriteLine(_user.ControlNumber);


        }
    }
    finally
    {
        //conn.Close();
    }

}

但是,在该_user.ControlNumber.Add(Convert.ToInt32(row["ControlNumber"]));行中,我得到“对象引用未设置为对象的实例”。错误。有什么帮助吗?

我要做的是为每个用户创建一个包含用户控制号的类。然后,我希望将所有这些类放入字典中以供参考。

4

6 回答 6

18

您需要在构造函数中初始化列表:

   public User (string username) : this()
   {
       _name = username;
   }
   public User()
   {
      this.ControlNumber = new List<int>();
   }

否则,ControlNumber将有其默认值 null。

于 2013-06-06T15:56:42.510 回答
2

确保在使用列表之前对其进行初始化!

更正的用户类:

public class User
{
   private string _name;
   public string UserName { get; set; }       
   public List<int> ControlNumber { get; set; }
   public User (string username) : this()
   {
       _name = username;
   }
   public User()
   {
       ControlNumber = new List<int>();
   }

}

而且,在转换row["ControlNumber"]为整数之前,您应该确保它不为空。

if (row["ControlNumber"] != null)
{
user.ControlNumber.Add(Convert.ToInt32(row["ControlNumber"]));
}
于 2013-06-06T15:58:28.063 回答
2

您尚未初始化ControlNumber,您可以在构造函数中执行此操作,例如

public User (string username)
{
    _name = username;
    ControlNumber = new List<int>();
}

或者就在你尝试之前Add

_user.ControlNumber = new List<int>();
_user.ControlNumber.Add(Convert.ToInt32(row["ControlNumber"]));

我希望这有帮助。

于 2013-06-06T15:58:38.097 回答
1

默认情况下,您的ControlNumber属性设置为null

在您的构造函数中,执行以下操作将其初始化为一个空列表:

this.ControlNumber = new List<int>();
于 2013-06-06T15:57:31.400 回答
1

我讨厌在构造函数中设置属性,所以我要做的是:

private List<int> _controlNumber;
public List<int> ControlNumber { 
    get { 
        if (_controlNumber == null)
            _controlNumber=new List<int>(); 

        return _controlNumber; 
    }

    set { _controlNumber = value } 
}

或者干脆

private List<int> _controlNumber = new List<int>();
public List<int> ControlNumber { 
    get { return _controlNumber; } 
    set { _controlNumber = value } 
}
于 2013-06-06T16:06:29.057 回答
0

你定义了_user吗?我在你的例子中没有看到。

于 2013-06-06T15:57:50.170 回答