通用约束:我可以测试可以作为引用或值类型的泛型的等式吗?

时间:2010-10-05 12:42:37

标签: c# generics equality

我想要一个可以接受引用或值类型的通用类,并且只执行基于相等性测试的操作。请考虑以下事项:

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 个答案:

答案 0 :(得分:15)

最好的方法是EqualityComparer<T>.Default

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

请注意,这甚至会以逻辑方式为您处理空值(null等于null但没有别的)。