2010-12-07 5 views
3

J'ajoute un assemblage vb.net à une application C# existante.
Tous mes types de vb.net héritent de:Déclaration d'événement vb.net - ajout d'une attribution non sérialisée

<Serializable()> _ 
Public Class BaseObject Implements INotifyPropertyChanged 

    Public Event PropertyChanged as PropertyChangedEventHandler 

    'Other helper methods' 
End Class 

Mon problème est que l'événement ne peut pas être publié en feuilleton. En C# code, l'événement est déclarée comme ceci:

[field: NonSerialized] 
public event PropertyChangedEventHandler PropertyChanged; 

Mais je ne vois pas comment faire cela de quelque façon que vb.net. Y a-t-il une déclaration d'événement étendue que je peux utiliser pour que l'événement ne soit pas sérialisé? Ou autre attribution?

Répondre

5

Si vous utilisez Visual Basic 10 (fourni avec Visual Studio 2010), vous pouvez ajouter le NonSerializedAttribute à l'événement, comme vous le feriez en C#. Par exemple:

<Serializable()> _ 
Public Class BaseObject Implements INotifyPropertyChanged 

    <NonSerialized()> _ 
    Public Event PropertyChanged as PropertyChangedEventHandler 

    'Other helper methods' 
End Class 

Sinon, les choses deviennent un peu plus difficiles. Vous devez faire tout le travail vous-même au lieu de le laisser au compilateur. Voir this article pour plus de détails et des suggestions de mise en œuvre étape par étape.

+0

Mise à niveau vers 2010 est disponible, mais grâce à vous pour les deux informations! –

3

Les versions antérieures à VB10 nécessitent la déclaration de l'événement avec le mot-clé Custom afin que vous puissiez appliquer l'attribut au champ de sauvegarde privé. Cela ressemble à ceci:

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 
Questions connexes