2011-03-04 26 views
9

के लिए प्रतिनिधियों का परीक्षण करना मैं एक पदानुक्रमित संग्रह कक्षा का निर्माण कर रहा हूं जो चुंबकीय अनुनाद छवियों को स्थानिक रूप से आदेश देता है और उन्हें उत्पन्न करने के लिए उपयोग किए जाने वाले विभिन्न अधिग्रहण पैरामीटर के आधार पर समूह में व्यवस्थित करता है। समूह करने के लिए उपयोग की जाने वाली विशिष्ट विधि कक्षा के उपयोगकर्ता द्वारा प्रदान की जाती है। मैंने नीचे नमूना कोड में प्रासंगिक विशेषताओं को समझाया है। IEquatable<MyClass> कार्यान्वयन के लिए, मैं _myHelperDelegate की तुलना MyClass उदाहरणों की तुलना करने में सक्षम होना चाहता हूं यह निर्धारित करने के लिए कि क्या दोनों प्रतिनिधि कोड के उसी टुकड़े को इंगित करते हैं। नीचे दिए गए कथन में (_myHelperDelegate == other._myHelperDelegate) खंड स्पष्ट रूप से ऐसा करने का गलत तरीका है (यह संकलन करने में विफल रहता है, त्रुटि "विधि का नाम अपेक्षित") देता है। मेरा सवाल यह है कि क्या यह निर्धारित करने के लिए दो प्रतिनिधियों की तुलना करने का कोई तरीका है कि वे कोड के समान टुकड़े का संदर्भ लेते हैं या नहीं? यदि हां, तो आप यह कैसे करते हैं?समानता

public class MyClass : IEquatable<MyClass> 
{ 
    public delegate object HelperDelegate(args); 
    protected internal HelperDelegate _myHelperDelegate; 

    public MyClass(HelperDelegate helper) 
    { 
     ... 
     _myHelperDelegate = helper; 
    } 

    public bool Equals(MyClass other) 
    { 
     if (
      (_myHelperDelegate == other._myHelperDelegate) && 
      (... various other comparison criteria for equality of two class instances...) 
     ) 
     return true; 
     return false; 
    } 
} 
+4

"मैं एक पदानुक्रमित संग्रह वर्ग बना रहा हूं जो चुंबकीय अनुनाद छवियों को स्थानिक रूप से आदेश देता है" आपने मुझे खो दिया है। –

+0

प्रतिनिधि वर्ग में 'बराबर()' विधि है (http://msdn.microsoft.com/en-us/library/99bthb1z(v=VS.90).aspx), क्या आपने कोशिश की? – CodingGorilla

+0

समस्या के स्रोत के बारे में मेरा अंतर्ज्ञान गलत था। == वास्तव में काम करने वाले दो प्रतिनिधियों की तुलना काम करता है। समस्या मूल कोड में एक वाक्यविन्यास त्रुटि थी। अगर मैं कथन में खंडों के बीच && खो रहा था। * फेसपाल्म * – Matt

उत्तर

3

निम्नलिखित संकलित और अपेक्षित कार्य करता है।

private void Form1_Load(object sender, EventArgs e) 
{ 
    var helper1 = new TestDelegates.Form1.MyClass.HelperDelegate(Testing); 
    var helper2 = new TestDelegates.Form1.MyClass.HelperDelegate(Testing2); 
    var myClass1 = new MyClass(helper1); 
    var myClass2 = new MyClass(helper1); 

    System.Diagnostics.Debug.Print(myClass1.Equals(myClass2).ToString()); //true 

    myClass2 = new MyClass(helper2); 
    System.Diagnostics.Debug.Print(myClass1.Equals(myClass2).ToString()); //false 

} 

private object Testing() 
{ 
    return new object(); 
} 
private object Testing2() 
{ 
    return new object(); 
} 

public class MyClass : IEquatable<MyClass> 
{ 
    public delegate object HelperDelegate(); 
    protected internal HelperDelegate _myHelperDelegate; 

    public MyClass(HelperDelegate helper) 
    { 
    _myHelperDelegate = helper; 
    } 

    public bool Equals(MyClass other) 
    { 
     if (_myHelperDelegate == other._myHelperDelegate) 
     { 
     return true; 
     } 
     return false; 
    } 
} 
4

प्रति msdn, Delegate.Equals विधि रिटर्न:

true if obj and the current delegate have the same targets, methods, and invocation list; otherwise, false.

आप इस की कोशिश की?

+1

अधिक संभावना [MulticastDelegate] (http://msdn.microsoft.com/en-us/library/1ts3c5tx.aspx) उस विधि के कार्यान्वयन। –

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