2011-03-04 18 views
9

Sto costruendo una classe di raccolta gerarchica che ordina spazialmente le immagini di risonanza magnetica e li organizza in raggruppamenti basati sui vari parametri di acquisizione utilizzati per generarli. Il metodo specifico utilizzato per eseguire il raggruppamento è fornito dall'utente della classe. Ho estratto le funzioni rilevanti nel seguente codice di esempio. Per l'implementazione IEquatable<MyClass>, mi piacerebbe essere in grado di confrontare gli attributi _myHelperDelegate di due istanze MyClass per determinare se entrambi i delegati puntano allo stesso pezzo di codice. La clausola (_myHelperDelegate == other._myHelperDelegate) nella seguente istruzione if è chiaramente il modo sbagliato per farlo (non riesce a compilare, dando l'errore "Nome metodo previsto"). La mia domanda è, c'è un modo per confrontare due delegati per determinare se fanno riferimento allo stesso pezzo di codice? Se è così, come si fa?Testing delegati per l'uguaglianza

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

"Sto costruendo una classe di raccolta gerarchica che ordina spazialmente le immagini di risonanza magnetica" mi hai perso. –

+0

La classe Delegate ha un metodo 'Equals()' (http://msdn.microsoft.com/en-us/library/99bthb1z(v=VS.90).aspx), l'hai provato? – CodingGorilla

+0

La mia intuizione sull'origine del problema era errata. Il confronto tra i due delegati che usano == funziona davvero. Il problema era un errore di sintassi nel codice originale. Mi mancavano le && tra clausole nella dichiarazione if. * facepalm * – Matt

risposta

3

Il seguente compila e funziona come previsto.

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

Per msdn, Delegate.Equals metodo ritorna:

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

Hai provato questo?

+1

Più probabile [MulticastDelegate] (http://msdn.microsoft.com/en-us/library/1ts3c5tx.aspx) implementazione di quel metodo. –