【发布时间】: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:你读过它给出的错误吗?我无法为您引用编译器参考,但如果它在经验上不起作用,那么在没有任何更多信息的情况下说它应该不是很有帮助。