【问题标题】:Intercept property assignment to catch InvalidCastException拦截属性分配以捕获 InvalidCastException
【发布时间】:2016-04-14 02:45:01
【问题描述】:

我正在尝试使用 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

【问题讨论】:

    标签: .net vb.net postsharp


    【解决方案1】:

    我对 vb.net 不是 100% 确定,但真正令人高兴的是它被翻译成

    x.SetSomeProperty((MyEnum)"X")
    

    这只是普通的 .NET。在那之后,postsharps 试图阻止你的方法,但它会在演员表和 SetSomeProperty 之间插入自己。 (您可以使用 ilspy 验证这一点)。这意味着您无法拦截演员表。

    【讨论】:

      【解决方案2】:

      您的项目使用OptionStrict off 而不是

      x.SomeProperty = "X"
      

      VisualBasic 编译器生成

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

      CType 表达式甚至在调用 SomeProperty 的 getter 之前就抛出了 InvalidCastException,正如 Batavia 指出的那样。

      如果您设置OptionStrict on(命令行上的/optionstrict+),那么您会收到构建错误。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2016-12-03
        • 1970-01-01
        • 1970-01-01
        • 2013-08-21
        • 1970-01-01
        • 1970-01-01
        • 2014-02-09
        • 1970-01-01
        相关资源
        最近更新 更多