抱歉,我是C#的新手,特别是活动。 为什么我会收到NPE?
class WcfModel : IWcfModel
{
private List<ConsoleData> _dataList;
public List<ConsoleData> DataList
{
get { return _dataList; }
set { _dataList = value;
DataArrived(_dataList); // NPE
}
}
public event Action<List<ConsoleData>> DataArrived;
}
答案 0 :(得分:3)
如果没有对象订阅该事件(即委托没有订阅者),则它将是null
。你需要测试一下:
set {
_dataList = value;
var dataDel = DataArrived;
if(dataDel != null)
dataDel(_dataList);
}
或者,使用ObservableCollection<ConsoleData>
- 它内置了事件以更改集合。
答案 1 :(得分:1)
而是使用具有自己的事件发布者的ObservableCollection<ConsoleData>
。
class WcfModel : IWcfModel
{
private ObservableCollection<ConsoleData> _dataList;
public WcfModel ()
{
_dataList = new ObservableCollection<ConsoleData>();
_dataList.CollectionChanged += DataArrived
}
public ObservableCollection<ConsoleData> DataList
{
get { return _dataList; }
}
public event Action<object, NotifyCollectionChangedEventArgs> DataArrived;
}
现在每当你做
wcfModelInstance.DataList.Add(new ConsoleData("hello"));
当您在DataArrived
订阅WcfModel
活动时,系统会通知您。
希望这有帮助。
答案 2 :(得分:0)
您应该为事件添加一个null检查器,如下所示:
class WcfModel: IWcfModel
{
private List<ConsoleData> _dataList;
public List<ConsoleData> DataList
{
get { return _dataList; }
set
{
_dataList = value;
if ( DataArrived != null )
DataArrived ( _dataList );
}
}
public event Action<List<ConsoleData>> DataArrived;
}