使用转换运算符投放错误

时间:2018-07-28 17:25:05

标签: vb.net casting runtimeexception intermediate-language

我在执行Bar = IFoo时收到无效的强制转换异常,但在Bar = Foo时却没有,即使在运行时IFoo对象为Foo类型也是如此。这里的问题是与Bar类一起使用的程序集不应该不知道Foo类。 Foo是DbEntity,而Bar是包含Foo所有业务逻辑的内容。我可以在Bar中使用Factory方法,但是操作符非常方便!尤其是当Foo从Bar类退出以进行Bar类之外的数据库操作时。

当试图弄清楚发生了什么时,我偶然发现了这个article,这确实很有趣,但是没有为这种情况提供任何解决方案。我对这类奇怪的运行时异常了解不多,因此我有什么办法可以像我想要的那样将它们分开?为Bar使用工厂似乎是最简单的方法,但是我想知道是否有解决方法,以防万一我再次遇到类似问题,而这是不可行的。

所有其他大会引用的大会中:

Namespace ISpace

  Public Interface IFoo
  End Interface

  Public Interface IBar
    ReadOnly Property SomeProperty As Integer
  End Interface

End Namespace

在大会上只能由律师协会的大会引用

Namespace FooSpace

  Public Class Foo : Implements ISpace.IFoo
    Public SomeProperty As Integer
  End Class

End Namespace

在律师班的集会上

Namespace BarSpace

  Public Class Bar : Implements ISpace.IBar

    ReadOnly _value As FooSpace.Foo

    Private Sub New(value As FooSpace.Foo)
      _value = value
    End Sub

    Public ReadOnly Property SomeProperty As Integer Implements IBar.SomeProperty
      Get
        Return _value.SomeProperty
      End Get
    End Property

    Public Shared Widening Operator CType(ByVal value As FooSpace.Foo) As Bar
      Return New Bar(value)
    End Operator

    Public Shared Narrowing Operator CType(ByVal value As Bar) As FooSpace.Foo
      Return value._value
    End Operator
  End Class

End Namespace

在仅应引用律师协会的大会的大会中

Namespace TestSpace

  Public Class FooBarTest
    Public Shared Function GetMeBarFromFooFail(Foo As ISpace.IFoo) As IBar
      Dim bor As BarSpace.Bar
      bor = Foo 'Throws InvalidCastException
      Return bor
    End Function

    Public Shared Function GetMeBarFromFooPass(foo As ISpace.IFoo) As IBar
      Dim foofoo As FooSpace.Foo = foo
      Dim bar As BarSpace.Bar
      bar = foofoo 'No Exception
      Return bar
    End Function

  End Class

End Namespace

0 个答案:

没有答案