繁体   English   中英

拦截属性赋值以捕获InvalidCastException

[英]Intercept property assignment to catch InvalidCastException

我试图使用postharp 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

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

x.SetSomeProperty((MyEnum)"X")

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

您的项目使用OptionStrict off而不是

x.SomeProperty = "X"

VisualBasic编译器生成

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

即使在Batavia指出调用SomeProperty的getter之前,CType表达式也会抛出InvalidCastException。

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM