【问题标题】:Custom Event Conversion vb.net to c#自定义事件转换 vb.net 到 c#
【发布时间】:2013-06-10 10:46:03
【问题描述】:

我在将自定义事件从 vb.net 转换为 c# 时遇到了一些问题,我真的没有使用 vb.net 的经验,而且我对这些自定义事件的经验更少,应用程序的其余部分在没有转换的情况下很多问题,但是这个让我卡住了。我使用的转换器(付费和免费)都未能生成可用代码。

VB.net 代码:

<NonSerialized()> Private _objNonSerializablePropertyChangedHandlers As New System.ComponentModel.EventHandlerList

'''' <summary> 
'''' Raised when a public property of this object is set. 
'''' </summary> 
Public Custom Event PropertyChanged As PropertyChangedEventHandler Implements System.ComponentModel.INotifyPropertyChanged.PropertyChanged
    AddHandler(ByVal value As PropertyChangedEventHandler)
        Me.NonSerializablePropertyChangedHandlers.AddHandler(STR_PROPERTYCHANGEDEVENT, value)
    End AddHandler
    RemoveHandler(ByVal value As PropertyChangedEventHandler)
        Me.NonSerializablePropertyChangedHandlers.RemoveHandler(STR_PROPERTYCHANGEDEVENT, value)
    End RemoveHandler
    RaiseEvent(ByVal sender As Object, ByVal e As PropertyChangedEventArgs)

        Dim obj As PropertyChangedEventHandler = TryCast(Me.NonSerializablePropertyChangedHandlers(STR_PROPERTYCHANGEDEVENT), PropertyChangedEventHandler)

        If obj IsNot Nothing Then
            obj.Invoke(sender, e)
        End If

    End RaiseEvent

我已经设法在 c# 中产生的最好的结果如下:

C#

[NonSerialized()]
private System.ComponentModel.EventHandlerList _objNonSerializablePropertyChangedHandlers = new System.ComponentModel.EventHandlerList();

public event PropertyChangedEventHandler PropertyChanged
{
    add
    {
        this.NonSerializablePropertyChangedHandlers.AddHandler(STR_PROPERTYCHANGEDEVENT, value);
    }
    remove
    {
        this.NonSerializablePropertyChangedHandlers.RemoveHandler(STR_PROPERTYCHANGEDEVENT, value);
    }
}

protected void OnPropertyChanged(string strPropertyName)
{
    EventHandler handler = this.PropertyChanged;
    if (handler != null)
    {
        handler.Invoke(this, new PropertyChangedEventArgs(strPropertyName));
        //PropertyChanged(this, new PropertyChangedEventArgs(strPropertyName));
    }
}

但是这会引发错误“事件 'CardBase.PropertyChanged' 只能出现在 += 或 -=" 的左侧

就行了:EventHandler handler = this.PropertyChanged;

由于我不是 100% 了解上面的代码在做什么,我自己正在努力解决这个问题,如果有人可以帮助我,我将非常感激。

【问题讨论】:

  • 应该编译...
  • 与您的问题不完全相关,但您可以通过使用 Interlocked.CompareExchange 模式来获取您的事件处理程序来防止竞争条件。
  • @newStackExchangeInstance:你为什么这么说?这显然是一个有效的编译器错误...
  • @Chris 他提到的那一行看起来很有效......也许他应该把PropertyChangedEventHandler而不是EventHandler,但仍然。
  • @newStackExchangeInstance:你读过它给出的错误吗?我无法为您引用编译器参考,但如果它在经验上不起作用,那么在没有任何更多信息的情况下说它应该不是很有帮助。

标签: c# vb.net


【解决方案1】:

更改此代码

protected void OnPropertyChanged(string strPropertyName)
{
    EventHandler handler = this.PropertyChanged;
    if (handler != null)
    {
        handler.Invoke(this, new PropertyChangedEventArgs(strPropertyName));
    }
}

protected void OnPropertyChanged(string strPropertyName)
{
    var handler =
       this.NonSerializablePropertyChangedHandlers[STR_PROPERTYCHANGEDEVENT]
           as EventHandler;

    if (handler != null)
    {
        handler(this, new PropertyChangedEventArgs(strPropertyName));
    }
}

参考-event- can only appear on the left hand side of += or -=

【讨论】:

  • 这不是他的错误来自哪里,它来自顶线。
  • EventHandler handler = this.PropertyChanged; 仍然会抛出完全相同的编译器警告...
  • 你是对的。忽略了它。无论如何,我更新了解决方案。我猜自动事件发生了一些编译器魔术。由于您正在创建显式事件,因此您必须访问后备存储本身。顺便提一句。 VB.NET 代码已经这样做了。
  • 嘿,感谢您的回复,我必须承认,在查看 vb.net 代码时,我没有完全理解这段代码的作用。再次感谢!
  • 仅供参考:如果您不指定添加/删除,编译器会在后台生成一些代码以使其线程安全stackoverflow.com/questions/15646155/…,其中包括一个支持变量。无论出于何种原因,您的代码都引入了 EventHandlerList 作为多个 EventHandlers 的支持变量。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-02-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-01-31
  • 1970-01-01
相关资源
最近更新 更多