【发布时间】:2016-03-24 05:46:58
【问题描述】:
我得到一个空异常,但该字段被初始化为一个空列表。那怎么可能是null呢?
错误出现在这个方法的第二行(在_hydradProperties上):
protected virtual void NotifyPropertyChanged<T>(Expression<Func<T>> expression)
{
string propertyName = GetPropertyName(expression);
if (!this._hydratedProperties.Contains(propertyName)) { this._hydratedProperties.Add(propertyName); }
}
这就是该字段的声明方式:
public abstract class EntityBase<TSubclass> : INotifyPropertyChanged where TSubclass : class
{
private List<string> _hydratedProperties = new List<string>();
这是这样设置的:
public Eta Eta
{
get { return this._eta; }
set
{
this._eta = value;
NotifyPropertyChanged(() => this.Eta);
}
}
这是完整的课程(删除了 cmets 和不相关的部分):
[DataContract]
public abstract class EntityBase<TSubclass> : INotifyPropertyChanged where TSubclass : class
{
private List<string> _hydratedProperties = new List<string>();
public bool IsPropertyHydrated(string propertyName)
{
return this._hydratedProperties.Contains(propertyName);
}
public event PropertyChangedEventHandler PropertyChanged;
protected virtual void NotifyPropertyChanged<T>(Expression<Func<T>> expression)
{
string propertyName = GetPropertyName(expression);
if (!this._hydratedProperties.Contains(propertyName)) { this._hydratedProperties.Add(propertyName); }
PropertyChangedEventHandler handler = PropertyChanged;
if (handler != null)
{
handler(this, new PropertyChangedEventArgs(propertyName));
}
}
public string GetPropertyName<T>(Expression<Func<T>> expression)
{
MemberExpression memberExpression = (MemberExpression)expression.Body;
return memberExpression.Member.Name;
}
}
派生类:
[DataContract]
public class Bin : EntityBase<Bin>
{
private Eta _eta;
[DataMember]
public Eta Eta
{
get { return this._eta; }
set
{
this._eta = value;
NotifyPropertyChanged(() => this.Eta);
}
}
}
【问题讨论】:
-
@BobHorn 您是否偶然从多个线程写入列表?如果是这样,您可能需要实现锁或使用线程安全集合
-
我们确实需要准确的错误消息(包括提及的任何变量)和重现该错误的代表性代码示例。
-
我想他知道什么是空异常,现在他知道空异常是_hidratedProperties。他需要知道为什么。从使用通知属性改变,可能是在数据绑定的情况。可能是线程问题,很难说。
-
@Grundy 这不是重复的。这个问题是问为什么 IT 抛出
NullReferenceException而不是NullReferenceException...
标签: c#