2010-10-05 14 views
10

मुझे एक सामान्य जेनेरिक क्लास चाहिए जो या तो संदर्भ या मूल्य प्रकार स्वीकार कर सके, और केवल समानता परीक्षण के आधार पर एक क्रिया करे। निम्नलिखित पर विचार:जेनेरिक बाधाएं: क्या मैं जेनेरिक की समानता का परीक्षण कर सकता हूं जो संदर्भ या मूल्य प्रकार हो सकता है?

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

मैं मान प्रकार समानता बनाम संदर्भ प्रकार समानता परीक्षण करने के लिए सक्षम होने के लिए सामान्य की कमी और दो वर्गों का उपयोग करने आ रही है। क्या इसके चारों ओर कोई रास्ता है ताकि मैं सिर्फ एक वर्ग के साथ समाप्त हो जाऊं?

मैं विशेष रूप से ऐसे समाधान को नहीं चाहता हूं जिसमें मुक्केबाजी मूल्य प्रकार शामिल हों, प्रतिबिंब का उपयोग करके, या रन-टाइम आईएल पीढ़ी। क्या कोई आसान समाधान है जिसे मैंने यहां याद किया है? (शून्य शून्य पर लेकिन कुछ नहीं के बराबर है)

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

ध्यान दें कि यह भी तार्किक ढंग से आप के लिए शून्य मान संभालता है:

उत्तर

15

सबसे अच्छा तरीका यह करने के लिए क्या आम तौर पर EqualityComparer<T>.Default है।

+0

क्या यह 'IEquatable ' के लागू होने में परिभाषित किसी भी कस्टम बराबर तर्क का उपयोग करेगा? –

+1

@ जस्टिन, हाँ यह करता है, अगर प्रकार इसे लागू करता है। –

+0

@ जोन - हर दिन कुछ नया सीखें ... फिर से। –

संबंधित मुद्दे