2010-12-07 10 views
3

Ich füge eine vb.net Assembly zu bestehenden C# -Anwendung hinzu.
Alle meine vb.net Typen erben von:vb.net Event-Deklaration - Hinzufügen nicht serialisierter Attribution

<Serializable()> _ 
Public Class BaseObject Implements INotifyPropertyChanged 

    Public Event PropertyChanged as PropertyChangedEventHandler 

    'Other helper methods' 
End Class 

Mein Problem ist, dass das Ereignis nicht serialisiert werden kann. In C# -Code, wird das Ereignis wie folgt erklärt:

[field: NonSerialized] 
public event PropertyChangedEventHandler PropertyChanged; 

Aber ich kann nicht sehen, wie dies mit vb.net in irgendeiner Weise zu tun. Gibt es eine erweiterte Ereignisdeklaration, mit der ich das Ereignis nicht serialisieren kann? Oder andere Zuschreibung?

Antwort

5

Wenn Sie Visual Basic 10 verwenden (wie im Lieferumfang von Visual Studio 2010 enthalten), können Sie das Ereignis NonSerializedAttribute dem Ereignis hinzufügen, genau wie in C#. Zum Beispiel:

<Serializable()> _ 
Public Class BaseObject Implements INotifyPropertyChanged 

    <NonSerialized()> _ 
    Public Event PropertyChanged as PropertyChangedEventHandler 

    'Other helper methods' 
End Class 

Sonst wird es etwas schwieriger. Sie müssen die gesamte Arbeit selbst erledigen, anstatt sie nur dem Compiler zu überlassen. Weitere Details und Schritt-für-Schritt-Vorschläge zur Implementierung finden Sie unter this article.

+0

Upgrade auf 2010 ist verfügbar, aber danke für beide Informationen! –

3

Versionen, die älter als VB10 sind, müssen das Ereignis mit dem Schlüsselwort Custom deklarieren, damit Sie das Attribut auf das private Hintergrundfeld anwenden können. Das sieht so aus:

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 
Verwandte Themen