拦截属性赋值以捕获InvalidCastException

时间:2016-04-14 02:45:02

标签: .net vb.net postsharp

我正在尝试使用postsharp LocationInterceptionAspect拦截属性设置器,以便在将值设置为私有成员之前执行某些验证。它工作正常但是如果值数据类型与属性数据类型不兼容,则它会抛出InvalidCastException并且不会调用OnSetValue。有什么方法可以一般地捕获这个异常,使值无效然后用setter处理?

属性验证方面:

<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

2 个答案:

答案 0 :(得分:0)

我对vb.net并不是100%肯定,但真正讨厌的是这被翻译为

x.SetSomeProperty((MyEnum)"X")

这只是简单的.NET。之后,postharps试图隐藏你的方法,但它会在强制转换和SetSomeProperty之间插入。 (你可以用ilspy验证这一点)。这意味着你无法拦截演员。

答案 1 :(得分:0)

您的项目使用OptionStrict off而不是

x.SomeProperty = "X"

VisualBasic编译器生成

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

即使在按照Batavia指出的方式调用SomeProperty的getter之前,CType表达式也会引发InvalidCastException。

如果你设置OptionStrict on(/ optionstrict +在命令行上),那么你会得到一个构建错误。