Общие ограничения: Могу ли я проверить равенство универсального типа, который может быть ссылочным или типом значения?

Мне нужен единственный универсальный класс, который может принимать либо ссылочные типы, либо типы значений и выполнять действие только на основе проверки равенства. рассмотрим следующее:

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 во время выполнения. Есть ли простое решение, которое я здесь упустил?

10
задан Mark 5 October 2010 в 12:42
поделиться