我试图从此代码中找出导致Cannot perform runtime binding on a null reference
错误的原因:
var query = "SELECT Id, UserName, List_Order, LoggedIn " +
"FROM AspNetUsers" +
"WHERE LoggedIn = 1" +
"ORDER BY List_Order ASC";
var conn = new SqlConnection(System.Configuration.ConfigurationManager.ConnectionStrings["DefaultConnection"].ConnectionString);
var cmd = new SqlCommand(query, conn);
conn.Open();
var rdr = cmd.ExecuteReader();
var n = 0;
while(rdr.Read())
{
if (Convert.ToString(rdr["UserName"]) != null)
{
ViewBag.speakers[n] = new string[4] {
Convert.ToString(rdr["Id"]),
Convert.ToString(rdr["UserName"]),
Convert.ToString(rdr["List_Order"]),
Convert.ToString(rdr["LoggedIn"])
};
//Exception Details: Microsoft.CSharp.RuntimeBinder.RuntimeBinderException: Cannot
//perform runtime binding on a null reference
n++;
}
}
n++
增量似乎是导致此错误的原因,我不明白为什么。更新了代码以反射(reflect)可能的解决方案。但是,错误仍然存在。
尝试了同样的结果:
if (!string.IsNullOrWhiteSpace(Convert.ToString(rdr["UserName"]))) {
List<string> speakers = new List<string>();
speakers.Add(Convert.ToString(rdr["Id"]));
speakers.Add(Convert.ToString(rdr["UserName"]));
speakers.Add(Convert.ToString(rdr["List_Order"]));
speakers.Add(Convert.ToString(rdr["LoggedIn"]));
ViewBag.speakers[n] = speakers;
n++;
}
最佳答案
您的代码中有两个问题:
考虑一下:
public ActionResult Index()
{
int n = 0;
ViewBag.speakers[n] = 5;
return View();
}
由于未定义发言人(空引用),所以此简化的代码段引发了
Cannot perform runtime binding on a null reference
。您可以通过在循环之前在动态ViewBag中定义
speakers
来解决此问题:ViewBag.speakers = new List<string>();
第二期:
ViewBag.speakers[n] = speakers;
代码中的发言人是一个列表,您可能需要将
ViewBag.speakers
定义为List<List<string>>
并调用.Add(speakers)
而不是使用索引进行访问(您可能会获得索引超出范围)