Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/vb.net/16.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
自定义事件转换vb.net到c#_C#_Vb.net - Fatal编程技术网

自定义事件转换vb.net到c#

自定义事件转换vb.net到c#,c#,vb.net,C#,Vb.net,我在将自定义事件从vb.net转换为c#时遇到一些问题,我实际上没有vb.net的经验,而且我对这些自定义事件的经验更少,应用程序的其余部分转换时没有太多问题,但是这个问题让我卡住了。我使用的转换器(付费和免费)都无法生成可用的代码 VB.net代码: Private\u objnonSerializablePropertyChangedHandler作为新的System.ComponentModel.EventHandlerList '''' 设置此对象的公共属性时引发“”。 ''''

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

VB.net代码:

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));
    }
}