自定义事件转换vb.net到c#
我在将自定义事件从vb.net转换为c#时遇到一些问题,我实际上没有vb.net的经验,而且我对这些自定义事件的经验更少,应用程序的其余部分转换时没有太多问题,但是这个问题让我卡住了。我使用的转换器(付费和免费)都无法生成可用的代码 VB.net代码:自定义事件转换vb.net到c#,c#,vb.net,C#,Vb.net,我在将自定义事件从vb.net转换为c#时遇到一些问题,我实际上没有vb.net的经验,而且我对这些自定义事件的经验更少,应用程序的其余部分转换时没有太多问题,但是这个问题让我卡住了。我使用的转换器(付费和免费)都无法生成可用的代码 VB.net代码: Private\u objnonSerializablePropertyChangedHandler作为新的System.ComponentModel.EventHandlerList '''' 设置此对象的公共属性时引发“”。 ''''
Private\u objnonSerializablePropertyChangedHandler作为新的System.ComponentModel.EventHandlerList
''''
设置此对象的公共属性时引发“”。
''''
公共自定义事件PropertyChanged作为PropertyChangedEventHandler实现System.ComponentModel.INotifyPropertyChanged.PropertyChanged
AddHandler(作为PropertyChangedEventHandler的ByVal值)
Me.nonserializablePropertyChangedHandler.AddHandler(STR_PROPERTYCHANGEDEVENT,value)
EndAddHandler
RemoveHandler(ByVal值作为PropertyChangedEventHandler)
Me.NonSerializablePropertyChangedHandlers.RemoveHandler(STR_PROPERTYCHANGEDEVENT,value)
末端移除处理器
RaiseEvent(ByVal发送方作为对象,ByVal e作为属性ChangedEventArgs)
Dim obj As PROPERTYCHANGEDVENTHANDLER=TryCast(例如非序列化PROPERTYCHANGEDHANDLERS(STR_PROPERTYCHANGEDVENT),PROPERTYCHANGEDVENTHANDLER)
如果obj不是什么,那么
对象调用(发送方,e)
如果结束
端部提升孔
我用c#制作的最好作品如下:
C#
[NonSerialized()]
private System.ComponentModel.EventHandlerList _objNonSerializablePropertyChangedHandlers=新系统.ComponentModel.EventHandlerList();
公共事件属性ChangedEventHandler属性已更改
{
添加
{
this.NonSerializablePropertyChangedHandlers.AddHandler(STR_PROPERTYCHANGEDEVENT,value);
}
去除
{
this.NonSerializablePropertyChangedHandlers.RemoveHandler(STR_PROPERTYCHANGEDEVENT,value);
}
}
受保护的void OnPropertyChanged(字符串strPropertyName)
{
EventHandler=this.PropertyChanged;
if(处理程序!=null)
{
Invoke(这是新的PropertyChangedEventArgs(strPropertyName));
//PropertyChanged(这是新的PropertyChangedEventArgs(strPropertyName));
}
}
但是,这会引发一个错误“事件'CardBase.PropertyChanged'只能出现在+=或-=的左侧”
在行上:EventHandler=this.PropertyChanged
由于我不是100%了解上面的代码在做什么,我自己正在努力解决这个问题,如果有人能在这方面提供帮助,我将不胜感激。更改此代码
protected void OnPropertyChanged(string strPropertyName)
{
EventHandler handler = this.PropertyChanged;
if (handler != null)
{
handler.Invoke(this, new PropertyChangedEventArgs(strPropertyName));
}
}
到
引用应该编译…与您的问题不完全相关,但您可以通过使用Interlocked.compareeexchange模式获取事件处理程序来防止争用情况。@newStackExchangeInstance:为什么这样说?这显然是一个有效的编译器错误…@Chris他提到的那行看起来有效。。。也许他应该把
属性changedeventhandler
而不是事件处理程序
,但是仍然是这样。@newstackexchangeeinstance:你读到它给出的错误了吗?我无法向您引用编译器参考,说明其位置,但如果根据经验,它不起作用,那么在没有更多信息的情况下说它应该起作用是没有多大帮助的。这不是他的错误的来源,它来自最上面一行。EventHandler=this.PropertyChanged
仍然会抛出完全相同的编译器警告当然…你是对的。忽略了它。无论如何,我更新了解决方案。我猜自动事件会发生一些神奇的事情。由于要创建显式事件,因此必须访问备份存储本身。顺便说一句,VB.NET代码已经做到了这一点。嘿,谢谢你的回复,我必须承认,在浏览VB.NET代码时,我没有完全理解这段代码的作用。再次感谢!仅供参考:如果不指定添加/删除,编译器会在后台生成一些代码,以使其线程安全,其中包括一个支持变量。无论出于何种原因,您的代码引入了一个EventHandlerList作为多个EventHandler的支持变量。
protected void OnPropertyChanged(string strPropertyName)
{
var handler =
this.NonSerializablePropertyChangedHandlers[STR_PROPERTYCHANGEDEVENT]
as EventHandler;
if (handler != null)
{
handler(this, new PropertyChangedEventArgs(strPropertyName));
}
}