【问题标题】:vb.net event declaration - adding nonserialized attributionvb.net 事件声明 - 添加非序列化属性
【发布时间】:2010-12-07 14:38:36
【问题描述】:

我正在向现有的 c# 应用程序添加一个 vb.net 程序集。
我所有的 vb.net 类型都继承自:

<Serializable()> _
Public Class BaseObject Implements INotifyPropertyChanged

    Public Event PropertyChanged as PropertyChangedEventHandler

    'Other helper methods'
End Class

我的问题是事件不能被序列化。在 c# 代码中,事件是这样声明的:

 [field: NonSerialized]
 public event PropertyChangedEventHandler PropertyChanged;

但我看不出如何用 vb.net 以任何方式做到这一点。是否有扩展事件声明可用于使事件不序列化?还是其他归属?

【问题讨论】:

    标签: vb.net


    【解决方案1】:

    如果您使用的是 Visual Basic 10(随 Visual Studio 2010 提供),您可以将 NonSerializedAttribute 添加到事件中,就像在 C# 中一样。例如:

    <Serializable()> _
    Public Class BaseObject Implements INotifyPropertyChanged
    
        <NonSerialized()> _
        Public Event PropertyChanged as PropertyChangedEventHandler
    
        'Other helper methods'
    End Class
    

    否则,事情会变得更加困难。你必须自己做所有的工作,而不是把它留给编译器。有关详细信息和分步实施建议,请参阅this article

    【讨论】:

    • 可以升级到 2010,但感谢您提供这两个信息!
    【解决方案2】:

    早于 VB10 的版本需要使用 Custom 关键字声明事件,以便您可以将属性应用于私有支持字段。看起来像这样:

    Imports System.Runtime.CompilerServices
    ...
        <NonSerialized()> _
        Private propchanged As PropertyChangedEventHandler
    
        Public Custom Event PropertyChanged As PropertyChangedEventHandler
            <MethodImpl(MethodImplOptions.Synchronized)> _
            AddHandler(ByVal value As PropertyChangedEventHandler)
                propchanged = DirectCast([Delegate].Combine(propchanged, value), PropertyChangedEventHandler)
            End AddHandler
            <MethodImpl(MethodImplOptions.Synchronized)> _
            RemoveHandler(ByVal value As PropertyChangedEventHandler)
                propchanged = DirectCast([Delegate].Remove(propchanged, value), PropertyChangedEventHandler)
            End RemoveHandler
            RaiseEvent(ByVal sender As Object, ByVal e As System.ComponentModel.PropertyChangedEventArgs)
                Dim handler = propchanged
                If handler IsNot Nothing Then handler(sender, e)
            End RaiseEvent
        End Event
    

    【讨论】:

      猜你喜欢
      • 2015-09-26
      • 1970-01-01
      • 2013-02-15
      • 1970-01-01
      • 2019-05-15
      • 1970-01-01
      • 2023-03-07
      • 1970-01-01
      • 2013-01-28
      相关资源
      最近更新 更多