我想要一个可以接受引用或值类型的通用类,只能基于相等性测试执行操作.考虑以下几点:
- public class Property<TProp>
- where TProp : struct,IEquatable<TProp>
- {
- public TProp Value;
- public void SetValue(ObservableObject owner,TProp value)
- {
- if (!Value.Equals(value)) // cannot use != on struct constrained TProp
- {
- // ... set the property
- }
- }
- }
- public class ByRefProperty<TProp>
- where TProp : class // Dont want to require IEquatable<> on reference type TProp
- {
- public TProp Value;
- public void SetValue(ObservableObject owner,TProp value)
- {
- if (Value != value)
- {
- // ... set the property
- }
- }
- }
我不得不使用通用约束和两个类来测试值类型相对于参考类型的相等性.有没有办法让我只有一个班?
解决方法
最好的办法是一般为
EqualityComparer<T>.Default
:
- public void SetValue(ObservableObject owner,TProp value)
- {
- if (!EqualityComparer<TProp>.Default.Equals(Value,value))
- {
- // ... set the property
- }
- }
请注意,这甚至以逻辑方式为您处理空值(null等于null但没有其他).