C# 测试代表的平等性

C# 测试代表的平等性,c#,delegates,equality,C#,Delegates,Equality,我正在构建一个分层收集类,该类在空间上对磁共振图像进行排序,并根据用于生成它们的各种采集参数将它们排列成组。用于执行分组的特定方法由类的用户提供。我已经在下面的示例代码中抽象出了相关特性。对于IEquatable实现,我希望能够比较两个MyClass实例的\u myHelperDelegate属性,以确定两个代理是否指向同一段代码。下面if语句中的(\u myHelperDelegate==other.\u myHelperDelegate)子句显然是执行此操作的错误方法(它无法编译,给出错误“

我正在构建一个分层收集类,该类在空间上对磁共振图像进行排序,并根据用于生成它们的各种采集参数将它们排列成组。用于执行分组的特定方法由类的用户提供。我已经在下面的示例代码中抽象出了相关特性。对于
IEquatable
实现,我希望能够比较两个
MyClass
实例的
\u myHelperDelegate
属性,以确定两个代理是否指向同一段代码。下面if语句中的
(\u myHelperDelegate==other.\u 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;
   }
}
公共类MyClass:IEquatable
{
公共委托对象HelperDelegate(args);
受保护的内部HelperDelegate\u myHelperDelegate;
公共MyClass(HelperDelegate helper)
{
...
_myHelperDelegate=助手;
}
公共布尔等于(MyClass其他)
{
如果(
(_myHelperDelegate==其他._myHelperDelegate)&&
(…两个类实例相等的各种其他比较标准…)
)
返回true;
返回false;
}
}
每,
委托。等于方法返回:

如果obj和当前委托具有相同的目标、方法和调用列表,则为
true;否则为false。


您尝试过这个吗?

下面的编译和工作符合预期

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;
   }
}
private void Form1\u加载(对象发送方,事件参数e)
{
var helper1=newtestdelegate.Form1.MyClass.HelperDelegate(测试);
var helper2=newtestdelegate.Form1.MyClass.HelperDelegate(Testing2);
var myClass1=新的MyClass(helper1);
var myClass2=新的MyClass(helper1);
System.Diagnostics.Debug.Print(myClass1.Equals(myClass2.ToString());//true
myClass2=新的MyClass(helper2);
System.Diagnostics.Debug.Print(myClass1.Equals(myClass2.ToString());//false
}
私有对象测试()
{
返回新对象();
}
私有对象测试2()
{
返回新对象();
}
公共类MyClass:IEquatable
{
公共委托对象HelperDelegate();
受保护的内部HelperDelegate\u myHelperDelegate;
公共MyClass(HelperDelegate helper)
{
_myHelperDelegate=助手;
}
公共布尔等于(MyClass其他)
{
如果(_myHelperDelegate==其他._myHelperDelegate)
{
返回true;
}
返回false;
}
}

“我正在构建一个分层收集类,该类在空间上对磁共振图像进行排序”您失去了我。委托类确实有一个
Equals()
方法(),您尝试过吗?我对问题根源的直觉是错误的。使用==对两个委托进行比较确实有效。问题是原始代码中存在语法错误。if语句中缺少&&between子句。facepalm@Yuriy-图像的空间排列与实际问题相切,可以省略而不失去概括性,除非我想指出,两位代表的比较具有现实目的,试图先发制人地避免“你到底为什么要这样做?”多样性。更可能实现该方法。