你的问题是:
where T : IEquatable<T>
上面写着
T
IEquatable<T>
. 你希望它可以为空。你可以通过添加
?
:
where T : IEquatable<T>?
注意,这将抱怨
if (current.Equals(newValue))
,如果
current
是
null
通常的方法不是通过约束
成为一个
可量化<T>
,但要使用
EqualityComparer<T>.Default
T型
工具
可量化<T>
IEquatable<T>.Equals
,否则返回到调用
object.Equals
.
这也解决了您的NRE问题,如果
是
无效的
:
public static void NotifyChanged<T>(
this INotifyPropertyChanged inpc,
ref T current, T newValue,
Action<PropertyChangedEventArgs> eventRaiser,
[CallerMemberName] string? name = null)
{
if (EqualityComparer<T>.Default.Equals(current, newValue)) { return; }
current = newValue;
eventRaiser(new PropertyChangedEventArgs(name));
}
eventRaiser
:通常你会
NotifyChanged
基类上实现
INotifyPropertyChanged
,而不是使其成为扩展方法。然后你就可以
提高
PropertyChanged
OnPropertyChanged
使
财产变更
打电话给
通知已更改
.
PropertyChangedEventHandler
:
public static void NotifyChanged<T>(
this INotifyPropertyChanged _,
ref T current, T newValue,
PropertyChangedEventHandler eventHandler,
[CallerMemberName] string? name = null)
{
if (EqualityComparer<T>.Default.Equals(current, newValue)) { return; }
current = newValue;
eventHandler?.Invoke(this, new PropertyChangedEventArgs(name));
}
this.NotifyChanged(ref rootExpression, value, PropertyChanged);