C# 事件发送方上的相等性

C# 事件发送方上的相等性,c#,events,equals,C#,Events,Equals,我有一个UI小部件的界面,其中两个是演示者的属性 public IMatrixWidget NonProjectActivityMatrix { set { // validate the incoming value and set the field _nonProjectActivityMatrix = value; .... // configure & load no

我有一个UI小部件的界面,其中两个是演示者的属性

public IMatrixWidget NonProjectActivityMatrix {
        set {
            // validate the incoming value and set the field
            _nonProjectActivityMatrix = value;
            ....
            // configure & load non-project activities
     }

public IMatrixWidget ProjectActivityMatrix {
        set {
            // validate the incoming value and set the field
            _projectActivityMatrix = value;
            ....
            // configure & load project activities
   }
小部件具有两个presenter对象都订阅的事件,因此presenter中有一个事件处理程序,如下所示:

public void OnActivityEntry(object sender, EntryChangedEventArgs e) {
    // calculate newTotal here
    ....
        if (ReferenceEquals(sender, _nonProjectActivityMatrix)) {
            _nonProjectActivityMatrix.UpdateTotalHours(feedback.ActivityTotal);
        }

        else if (ReferenceEquals(sender, _projectActivityMatrix)) {
            _projectActivityMatrix.UpdateTotalHours(feedback.ActivityTotal);
        }
        else {
            // ERROR - we should never be here
        }
    }
问题是发送方上的ReferenceEquals失败,即使它是作为发送方的已实现小部件-与设置为presenter属性的已实现小部件相同

谁能发现问题/解决方法是什么

干杯, 贝里尔

我不知道你能很好地编辑。凉的以下是事件引发代码:

void OnGridViewNumericUpDownEditingControl_ValueChanged(object sender, EventArgs e)
    {
    // omitted to save sapce

        if (EntryChanged == null) return;

        var args = new EntryChangedEventArgs(activityID, dayID, Convert.ToDouble(amount));
        EntryChanged(this, args);
    }
以下是演示者属性sans namespace info的调试器转储:

?_nonProjectActivityMatrix
{WinPresentation.Widgets.MatrixWidgetDgv}
[WinPresentation.Widgets.MatrixWidgetDgv]: {WinPresentation.Widgets.MatrixWidgetDgv}
以下是发送方的调试器转储:

?sender
{WinPresentation.Widgets.MatrixWidgetDgv}
base {Core.GUI.Widgets.Lookup.MatrixWidgetBase<Core.GUI.Widgets.Lookup.DynamicDisplayDto>}: {WinPresentation.Widgets.MatrixWidgetDgv}
_configuration: {Domain.Presentation.Timesheet.Matrix.WeeklyMatrixConfiguration}
_wrappedWidget: {Win.Widgets.DataGridViewDynamicLookupWidget}
AllowUserToAddRows: true
ColumnCount: 11
Count: 4
EntryChanged: {Method = {Void OnActivityEntry(System.Object, Smack.ConstructionAdmin.Domain.Presentation.Timesheet.Matrix.EntryChangedEventArgs)}}
SelectedCell: {DataGridViewNumericUpDownCell { ColumnIndex=3, RowIndex=3 }}
SelectedCellValue: "0.00"
SelectedColumn: {DataGridViewNumericUpDownColumn { Name=MONDAY, Index=3 }}
SelectedItem: {'AdministrativeActivity: 130-04', , AdministrativeTime, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00}
?发送方
{WinPresentation.Widgets.MatrixWidgetDgv}
base{Core.GUI.Widgets.Lookup.MatrixWidgetBase}:{WinPresentation.Widgets.MatrixWidgetDgv}
_配置:{Domain.Presentation.Timesheet.Matrix.WeeklyMatrix配置}
_wrappedWidget:{Win.Widgets.DataGridViewDynamicLookupWidget}
AllowUserToAddress:正确
列数:11
计数:4
EntryChanged:{Method={Void OnActivityEntry(System.Object,Smack.ConstructionAdmin.Domain.Presentation.Timesheet.Matrix.EntryChangedEventArgs)}
SelectedCell:{DataGridViewNumericUpDownCell{ColumnIndex=3,RowIndex=3}}
SelectedCellValue:“0.00”
SelectedColumn:{DataGridViewNumericUpDownColumn{Name=MONDAY,Index=3}
选择编辑项:{'AdministrativeActivity:130-04',AdministrativeTime,0.00,0.00,0.00,0.00,0.00,0.00,0.00}
  • 贝里尔

我可以从脑海中想到引用equals返回false的以下原因:

  • sender
    null
    -验证小部件在引发事件时是否将
    作为sender参数发送
  • 由于某种原因,小部件未分配给演示者,因此它是
    null
  • 发送者
    不是你想象的那样(你如何验证它确实是你期望的发送者)
  • 小部件实现为
    结构
    ,而不是
可能还有更多,但这就是我要开始的地方(按顺序)

更新:吸引我眼球的一件事是:

_wrappedWidget: {Win.Widgets.DataGridViewDynamicLookupWidget}

可能是发送者是一个包装小部件的对象吗?如果是这种情况,在进行比较时,ReferenceEquals将自然返回false。

请添加引发事件的代码段。现在我们只能猜测,EntryChanged内部发生了什么;你有它的代码吗?贝丽尔,你可以编辑你的原始问题。为什么你不能设置一个断点,然后在Visual Studio中检查这两个变量?你好。是我干的。我是说调试器在我编辑的问题中转储。Thx,b小部件是DataGridView(类)的包装器。我正在检查调试器转储(以及我如何知道它不为null)到列表中剩余的两种可能性:这是presenter属性转储,包含名称空间信息:?_nonProjectActivityMatrix{Smack.ConstructionAdmin.WinPresentation.Widgets.MatrixWidgetDgv}Hi Fredrik[Smack.ConstructionAdmin.WinPresentation.Widgets.MatrixWidgetDgv]:{Smack.ConstructionAdmin.WinPresentation.Widgets.MatrixWidgetDgv}我不太理解看起来像索引的部分(widget[widget]){Smack ConstructionAdmin.WinPresentation.Widgets.MatrixWidgetDgv}base{Smack Core.GUI.Widgets.Lookup.MatrixWidgetDgv}:{Smack.ConstructionAdmin.WinPresentation.Widgets.MatrixWidgetDgv}{u配置:{Smack.ConstructionAdmin.Domain.Presentation.Timesheet.Matrix.WeeklyMatrixConfiguration}{u wrappedWidget:{Smack.Win.Widgets.DataGridViewDynamicLookupWidget}我关闭了数据网格视图调试器信息。格式不太好。第二条注释是来自小部件调试器转储的类型信息。事件引发代码:void OnGridViewNumericUpDownEditingControl_ValueChanged(object sender,EventArgs e){//省略以保存sapce if(EntryChanged==null)return;var args=new EntryChangedEventArgs(activityID,dayID,Convert.ToDouble(amount));EntryChanged(this,args);}将代码示例添加到原始问题insead中;这样可以更容易地格式化那里的代码,也可以更容易地为其他能够提供答案的用户找到代码示例:)