2010-12-07 7 views
3

vb.netアセンブリを既存のC#アプリケーションに追加します。私の問題は、イベントをシリアル化することができないということですvb.netイベント宣言 - シリアル化されていないアトリビュートを追加する

<Serializable()> _ 
Public Class BaseObject Implements INotifyPropertyChanged 

    Public Event PropertyChanged as PropertyChangedEventHandler 

    'Other helper methods' 
End Class 


私vb.netの種類のすべてを継承します。 C#のコードでは、イベントは次のように宣言されています:

[field: NonSerialized] 
public event PropertyChangedEventHandler PropertyChanged; 

しかし、私はvb.netでどのような方法でこれを行う方法を見ることができません。イベントをシリアル化しないようにするための拡張イベント宣言がありますか?その他の帰属は?

答えて

5

Visual Studio 2010(Visual Studio 2010に同梱)を使用している場合は、C#と同じようにNonSerializedAttributeをイベントに追加できます。例:

<Serializable()> _ 
Public Class BaseObject Implements INotifyPropertyChanged 

    <NonSerialized()> _ 
    Public Event PropertyChanged as PropertyChangedEventHandler 

    'Other helper methods' 
End Class 

そうしないと、状況が少し難しくなります。あなたは、それをコンパイラに任せるのではなく、自分ですべての作業を行う必要があります。詳細および段階的な実装の提案については、this articleを参照してください。

+0

2つの情報の両方に感謝します。 –

3

VB10より前のバージョンでは、キーワードを使用してイベントを宣言する必要があるため、この属性をプライベートバッキングフィールドに適用することができます。これは次のようになります。

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