【问题标题】:Object throws NullReferenceException对象抛出 NullReferenceException
【发布时间】:2016-05-21 17:12:54
【问题描述】:
  • 我有一个类 Product 包含很少的公共 properties

  • 我有另一个类 ListOfProducts 应该包含一个 Product 对象列表

  • 我的 service.svn 类中有一个方法,我在其中检索行并希望通过创建 ListOfProducts 对象并将 Product 对象添加到类 ListOfProducts 中的列表中并返回此对象。 但似乎它不应该这样做。因为接收这个List的service_GetObjectCompleted会抛出NullReferenceException

ListOfProducts

[DataContract()]
public class ListOfProducts
{
    [DataMember()]
    public List<Product> ProductList { get; set; }

    public ListOfProducts()
    {
        ProductList = new List<Product>();
    }
}

Service.svn 类中创建对象ListOfProducts 并将Product 对象添加到其列表中的方法

public ListOfProducts GetObject()
{
    ListOfProducts Listproducts = new ListOfProducts();
    ........
    using (IDataReader reader = cmd.ExecuteReader())
    {
        while (reader.Read())
        {
            Product product = new Product(reader["Name"].ToString(), reader["Code"].ToString());
            Listproducts.ProductList.Add(product);
        }
    }
    return Listproducts;
}

上述方法返回的e中接收Listproducts的WCF的完成事件:

void service_GetObjectCompleted(object sender, GetObjectCompletedEventArgs e)
{
    if (e.Result.Count != 0)  //throws NullReferenceException
    {
        PagedCollectionView pagingCollection = new PagedCollectionView(e.Result);
        pgrProductGrids.Source = pagingCollection;
        grdProductGrid.ItemsSource = pagingCollection;
    }
}

我认为我的概念在这里是错误的。创建 List 对象的方法是否正确?

编辑

在页面的构造函数中,这就是我订阅GetObjectCompleted 事件的方式

service.GetObjectCompleted += service_GetObjectCompleted;

在按钮单击事件中,我正在异步调用 GetObject

service.GetObjectAsync();

【问题讨论】:

  • 你在什么时候得到这个异常。 ?
  • service_GetObjectCompleted 中我引用了e,这意味着它的null。尽管从GetObject 返回了一个对象,但它为空。我究竟做错了什么?发送创建其他类列表的对象是否正确?
  • 你能显示你的客户代码吗?如何调用 GetObject 操作?您如何订阅 GetObject Completed Event
  • e 只是一个事件参数。我认为它不会返回数据或Listproducts
  • @Viru 检查已编辑帖子

标签: c# list object nullreferenceexception


【解决方案1】:

解串器did not call your constructor!

因此,当您在服务的另一端检索您的ListOfProducts 时,ProductList 属性仍然是null

【讨论】:

  • 链接的帖子中有一个建议。除此之外,我需要很多了解你在做什么,而不是在 Stack Overflow 问题中。
  • @JoelCoehoorn 这里的问题似乎有所不同。链接说反序列化时不会调用构造函数,但这不是问题......在类型初始化后,它应该在构建类型时设置productList公共数据成员。
  • GetObject 方法中,我在return Listproducts 上放了一个断点,它包含列表,但在接收端e 包含null
【解决方案2】:

已解决

问题出在service_GetObjectCompleted 事件中。而不是像e.Result 那样引用list,我需要像e.Result.ProductList 那样引用它。所以这是有效的版本:

void service_GetObjectCompleted(object sender, GetObjectCompletedEventArgs e)
{
    if (e.Result.Productlist.Count != 0)  
    {
        PagedCollectionView pagingCollection = new PagedCollectionView(e.Result.Productlist);
        pgrProductGrids.Source = pagingCollection;
        grdProductGrid.ItemsSource = pagingCollection;
    }
}

【讨论】:

  • 直到我更新了我的服务参考。由于我更改了操作合同的返回类型,因此没有更新
猜你喜欢
  • 2013-05-30
  • 1970-01-01
  • 2010-09-12
  • 1970-01-01
  • 2020-11-17
  • 2016-03-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多