[英]IDictionary Property on model throwing System.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.