通用约束: 我能测试既可以是引用类型又可以是值类型的泛型相等性吗?

11

我想要一个通用的类,既可以接受引用类型也可以接受值类型,并且只根据相等测试执行操作。考虑以下内容:

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

我必须使用泛型约束和两个类来测试值类型的相等性和引用类型的相等性。有没有什么方法可以绕过这个问题,以便最终只需一个类?

我不想使用装箱值类型、反射或运行时IL生成的解决方案。我是否错过了一些简单的解决方案?

1个回答

16

通常最好的做法是使用EqualityComparer<T>.Default

public void SetValue(ObservableObject owner, TProp value)
{
   if (!EqualityComparer<TProp>.Default.Equals(Value, value))
   {
       // ... set the property
   }
}

请注意,这个方法甚至可以以逻辑方式处理空值(null等于null但不等于其他任何值)。


这会使用在 IEquatable<T> 实现中定义的任何自定义 Equals 逻辑吗? - Justin Niessner
1
@Justin,是的,如果类型实现了它。 - Jon Hanna
@Jon - 每天都要学点新东西...再次。 - Justin Niessner

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接