2011-03-04 9 views
9

나는 자기 공명 이미지를 공간적으로 정렬하고이를 생성하는 데 사용 된 다양한 획득 매개 변수를 기반으로 그룹으로 정렬하는 계층 적 컬렉션 클래스를 구축 중입니다. 그룹화를 수행하는 데 사용되는 특정 방법은 클래스 사용자가 제공합니다. 아래 샘플 코드에서 관련 기능을 추상화했습니다. IEquatable<MyClass> 구현의 경우 두 개의 MyClass 인스턴스의 _myHelperDelegate 특성을 비교하여 두 대리자가 동일한 코드를 가리키는 지 확인할 수 있기를 바랍니다. 아래의 if 문에 (_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

Delegate 클래스에는 'Equals()'메서드가 있습니다 (http://msdn.microsoft.com/en-us/library/99bthb1z(v=VS.90).aspx), 시도해 보셨습니까? – CodingGorilla

+0

문제의 원인에 대한 나의 직감이 올바르지 않습니다. ==를 사용하는 두 대표의 비교는 실제로 작동합니다. 문제는 원래 코드의 구문 오류입니다. 나는 if 문에 && 절을 놓치고있었습니다. * ImagePalm * – 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) 구현 가능성이 높습니다. –