对象引发 NullReferenceException

Object throws NullReferenceException

提问人:Multi stack 提问时间:2/11/2016 最后编辑:Multi stack 更新时间:2/11/2016 访问量:109

问:

  • 我有一个包含很少公共的类Productproperties

  • 我还有另一个类应该包含对象列表ListOfProductsProduct

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

ListOfProducts

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

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

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

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;
}

WCF 的 Completed 事件,该事件从上述方法返回:Listproductse

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;
    }
}

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

编辑

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

service.GetObjectCompleted += service_GetObjectCompleted;

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

service.GetObjectAsync();
C# 列表 对象 NullReferenceException

评论

0赞 Viplock 2/11/2016
在什么时候出现此异常。?
0赞 Multi stack 2/11/2016
在我引用的任何地方,这意味着它的.尽管从其 null 返回一个对象。我做错了什么?这是发送创建其他类列表的对象的正确方法吗?service_GetObjectCompletedenullGetObject
1赞 Viru 2/11/2016
你能展示你的客户端代码吗?如何调用 GetObject 操作?如何订阅 GetObject Completed 事件
0赞 Viplock 2/11/2016
e只是一个事件参数。我认为它不会返回您数据或.Listproducts
0赞 Multi stack 2/11/2016
@Viru 检查编辑后的帖子

答:

0赞 Joel Coehoorn 2/11/2016 #1

反序列化程序没有调用您的构造函数!

因此,当您在服务的另一端检索 your 时,该属性仍为 。ListOfProductsProductListnull

评论

0赞 Joel Coehoorn 2/11/2016
链接的帖子中有一个建议。除此之外,我需要更多地了解您正在做的事情,而不是 Stack Overflow 问题。
0赞 Viru 2/11/2016
@JoelCoehoorn问题似乎有所不同。Link 说在反序列化时不会调用 Constructor,但这不是这里的问题......初始化类型后,应在生成类型时设置 productList 公共数据成员。
0赞 Multi stack 2/11/2016
在该方法中,我放置了一个断点,它包含列表,但在接收端包含GetObjectreturn Listproductsenull
0赞 Multi stack 2/11/2016 #2

解决

问题出在事件中。我需要引用它,而不是引用类似的东西。所以这里是有效的版本:service_GetObjectCompletedliste.Resulte.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;
    }
}

评论

0赞 Multi stack 2/11/2016
直到我更新了我的服务参考。由于我更改了操作合同的返回类型,因此没有更新