Тестирование делегатов на равенство - PullRequest
11 голосов
/ 04 марта 2011

Я строю иерархический класс сбора, который упорядочивает магнитно-резонансные изображения пространственно и упорядочивает их в группы на основе различных параметров сбора, которые использовались для их генерации. Конкретный метод, используемый для выполнения группировки, предоставляется пользователем класса. Я абстрагировал соответствующие функции в примере кода ниже. Для реализации IEquatable<MyClass> я хотел бы иметь возможность сравнивать атрибуты _myHelperDelegate двух экземпляров MyClass, чтобы определить, указывают ли оба делегата на один и тот же фрагмент кода. Предложение (_myHelperDelegate == other._myHelperDelegate) в приведенном ниже утверждении if явно является неправильным способом сделать это (он не компилируется, выдавая ошибку «Ожидается имя метода»). У меня вопрос, есть ли способ сравнить двух делегатов, чтобы определить, ссылаются ли они на один и тот же кусок кода? Если да, то как ты это делаешь?

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

Ответы [ 2 ]

4 голосов
/ 04 марта 2011

Per msdn , Delegate.Equals метод возвращает:

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

Вы пробовали это?

3 голосов
/ 04 марта 2011

Следующие компилируется и работает как положено.

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