2016-04-14 3 views
1

プライベートメンバーに値を設定する前に、ポストシャープLocationInterceptionAspectを使用してプロパティ設定ツールをインターセプトして検証を実行しようとしています。ただし、値のデータ型がプロパティデータ型と互換性がなく、InvalidCastExceptionをスローし、OnSetValueを呼び出さない場合は正常に動作します。私は一般的にこの例外をキャッチでき、値を無効にしてからsetterで処理する方法はありますか?プロパティの代入を傍受するInvalidCastException

プロパティ検証アスペクト比:縦横が使用されている

<Serializable()> 
Public Class PropertyValidatorAttribute 
    Inherits LocationInterceptionAspect 

    Public Overrides Sub OnSetValue(args As LocationInterceptionArgs) 
     'Perform validation here 

     args.ProceedSetValue() 
    End Sub 
End Class 

クラス:

Public Enum MyEnum 
    A = 1 
    B = 2 
End Enum 

Public Class SampleClass 
    <PropertyValidator()> 
    Public Property SomeProperty As MyEnum 
End Class 

メイン:

Sub Main() 
    Dim x As New SampleClass() 
    x.SomeProperty = "X" 
End Sub 

答えて

0

は、私はvb.net約100%はよく分からないけど、本当にhappingingであることは、これは

x.SetSomeProperty((MyEnum)"X") 

これは単なる.NETでに変換されていることです。その後のpostsharpsはあなたのメソッドを受け取りますが、キャストとSetSomePropertyの間に挿入されます。 (これはilspyで確認できます)。つまり、キャストを傍受することはできません。

0

あなたのプロジェクトはOptionStrict offを使用し、代わりの

x.SomeProperty = "X" 

VisualBasicのコンパイラは

Dim temp = CType("X", MyEnum) 
x.SomeProperty = temp 

InvalidCastExceptionががバタビアが指摘するようにSomePropertyのゲッターが呼び出される前であってもctype関数式によってスローされますが生成されます。

OptionStrict on(コマンドラインで/ optionstrict +)を設定すると、ビルドエラーが発生します。

関連する問題