2010-10-05 28 views
10

Referans veya değer türlerini kabul edebilen ve yalnızca bir eşitlik testine dayalı bir eylem gerçekleştirebilen tek bir genel sınıf istiyorum. Aşağıdaki düşünün: Ben başvuru türü eşitlik vs değer türü eşitliğini test edebilmek için jenerik kısıtlamaları ve iki sınıfları kullanmak yaşıyorumGenel kısıtlamalar: Referans veya değer türü olabilen Genel Eşitliği test edebilir miyim?

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

. Bunun etrafında herhangi bir yolu var, böylece sadece bir sınıfla sonuçlanabilir miyim?

Özellikle boks değeri değerlerini, yansıma veya çalışma zamanı IL neslini kullanarak içeren bir çözüm istemiyorum. Burada özlediğim basit bir çözüm var mı?

cevap

15

iyi yolu bu yapmak genellikle EqualityComparer<T>.Default şudur: Bu bile mantıklı bir şekilde sizin için boş değerler kolları

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

Not ki (boş boş ama başka bir şey eşittir).

+0

Bu, "IEquatable " öğesinin uygulanmasında tanımlanan herhangi bir özel Eşitleme mantığı kullanacak mı? –

+1

@Justin, evet, eğer tür bunu uygularsa yapar. –

+0

@Jon - Her gün yeni bir şeyler öğrenin ... tekrar. –

İlgili konular