我正在尝试使用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
答案 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 +在命令行上),那么你会得到一个构建错误。