各位好!我已用Dictionary<string,string>获取了数据,现在想将name对应的value赋给一个对象数组中,请问用C#如何写语句?
我写的代码如下:
 public AlarmNotificationLoginInfo[] mappingByNotificationLoginInfo(Dictionary<string, string> dic)
    {
        AlarmNotificationLoginInfo[] anli = new AlarmNotificationLoginInfo[dic.Count];
        
        int i = 0;
        try
        {
            if (dic != null && dic.Count > 0)
            {
                foreach (KeyValuePair<string, string> kvp in dic)
                {                    if (i < dic.Count)
                    {
                        switch (kvp.Key)
                        {
                            case "username":
                                anli[i].Username = kvp.Value;
                                break;
                            case "password":
                                anli[i].Password = kvp.Value;
                                break;
                            default:
                                break;
                        }
                    }
                }
                i++;
            }
        }
        catch (Exception e)
        {
            throw e;        }
        return anli;
    }
问题出现在标红的地方,抛出异常:未将对象引用设置到对象的实例。
我已定义了数组的大小,为什么这里赋值就出错了呢?恳请各位高手指点一下!

解决方案 »

  1.   

    猜想,AlarmNotificationLoginInfo构造函数中username 为null
      

  2.   

    anli[i].Username = kvp.Value;
    改为:
    anli[i].Username = kvp.Value==null?"":kvp.Value;
      

  3.   

    AlarmNotificationLoginInfo[] anli = new AlarmNotificationLoginInfo[dic.Count]
    anli[0]是null的,应该先new AlarmNotificationLoginInfo()
    还有
    i++;应该放在foreach内。
      

  4.   

    AlarmNotificationLoginInfo 类是这么写的:
    using System;
    using System.Data;
    using System.Configuration;
    using System.Web;
    using System.Web.Security;
    using System.Web.UI;
    using System.Web.UI.WebControls;
    using System.Web.UI.WebControls.WebParts;
    using System.Web.UI.HtmlControls;/// <summary>
    /// AlarmNotificationLoginInfo 的摘要说明
    /// </summary>
    public class AlarmNotificationLoginInfo
    {
    public AlarmNotificationLoginInfo()
    {
    //
    // TODO: 在此处添加构造函数逻辑
    //
    }    private string username;
        private string password;    /// <summary>
        /// 用户名
        /// </summary>
        public string Username
        {
            get { return username; }
            set { username = value; }
        }    /// <summary>
        /// 密码
        /// </summary>
        public string Password
        {
            get { return password; }
            set { password = value; }
        }
    }
    lyb018提示说“AlarmNotificationLoginInfo[] anli = new AlarmNotificationLoginInfo[dic.Count]
    anli[0]是null的,应该先new AlarmNotificationLoginInfo()”,那是不是要先对对象数组进行初始化?
    我又加上了下面这段代码:
            AlarmNotificationLoginInfo[] anli = new AlarmNotificationLoginInfo[dic.Count];
            int i = 0;
            for (i = 0; i < anli.Length; i++)
            {
                anli[i].Username = "";
                anli[i].Password = "";
            }
    但是调试仍然抛出异常:使用new关键字创建对象实例,是不是要
    AlarmNotificationLoginInfo a = new AlarmNotificationLoginInfo();
    然后再对对象a进行初始化呀?恳请各位解答。
      

  5.   

    AlarmNotificationLoginInfo[] anli = new AlarmNotificationLoginInfo[dic.Count];
    我已经创建了对象实例,为什么还会报空指向的异常呢?
      

  6.   

    AlarmNotificationLoginInfo[] anli = new AlarmNotificationLoginInfo[dic.Count];
    这里你要新建一个对象:
    AlarmNotificationLoginInfo anliTest = new AlarmNotificationLoginInfo();
    anliTest.Username = "放入你想要的值";
    anliTest.Password = "放入你想要的值";
    然后加到数组中.AlarmNotificationLoginInfo[]这个是一个AlarmNotificationLoginInfo这种类型的数组,所以要先实例化一个这种类型,然后加进去.
      

  7.   

    AlarmNotificationLoginInfo anliTest = new AlarmNotificationLoginInfo();
    switch (kvp.Key)
      {
      case "username":
      anliTest.Username = kvp.Value;
      break;
      case "password":
      anliTest.Password = kvp.Value;
      break;
      default:
      break;
      }
    anli[i] = anliTest;
      

  8.   

    是kvp为null吧???你赋值前先判断下kvp是不是null!
      

  9.   

    还有一个问题想请教一下:
    现在我的代码按网友lyb018的提示修改如下:
     if (dic != null && dic.Count > 0)
                  {
                      foreach (KeyValuePair<string, string> kvp in dic)//取内容
                      {
                             switch (kvp.Key)
                             {
                                 case "username":
                                        al.Username = (kvp.Value == null ? "" : kvp.Value);
                                        break;
                                  case "password":
                                        al.Password = (kvp.Value == null ? "" : kvp.Value);
                                        break;
                                  default:
                                        break;
                                }
                            }

                        //获取记录条数
                     
                          for (int i = 0; i < dic.Count; i++)
                          {
                                anli[i] = al;
                          }

                    }
    现在能将对象放在对象数组中了。调试是取到的记录只有一条,但是dic.Count=2(我知道i<dic.Count肯定是不对的),但我现在怎么获得蓝色部分记录的条数,也就是下面标红的循环,怎么获取i<对象个数,这个对象个数怎么获得?恳请高手解答。
      

  10.   

    也就是如何根据dic.Count获取应该分配多大的空间给数组?
      

  11.   


            public AlarmNotificationLoginInfo[] mappingByNotificationLoginInfo(Dictionary<string, string> dic)
            {
                AlarmNotificationLoginInfo[] anli = new AlarmNotificationLoginInfo[dic.Count];            int i = 0;
                try
                {
                    if (dic != null && dic.Count > 0)
                    {
                        foreach (KeyValuePair<string, string> kvp in dic)
                        {
                            if (i < dic.Count)
                            {
                                anli[i] = new AlarmNotificationLoginInfo();
                                switch (kvp.Key)
                                {
                                    case "username":
                                        anli[i].Username = kvp.Value;
                                        break;
                                    case "password":
                                        anli[i].Password = kvp.Value;
                                        break;
                                    default:
                                        break;
                                }
                            }
                            i++;
                        }
                    }
                }
                catch (Exception e)
                {
                    throw e;            }
                return anli;
            }
    搞定
      

  12.   

      foreach (KeyValuePair<string, string> kvp in dic)
      {  if (i < dic.Count)
      {
      switch (kvp.Key)
      {
      case "username":
      anli[i].Username = kvp.Value;
      break;
      case "password":
      anli[i].Password = kvp.Value;
      break;
      default:
      break;
      }
      }
      }
      i++;
    请看下i++的位置,有问题!
      

  13.   

    anli[i] = new AlarmNotificationLoginInfo(); 放在foreach里面