首页 > 解决方案 > 转换运算符的转换错误

问题描述

在执行 Bar = IFoo 时,我得到一个 Invalid Cast Exception,但在 Bar = Foo 时却没有,即使在运行时 IFoo 对象属于 Foo 类型。这里的问题是与 Bar 类一起工作的程序集不应该知道 Foo 类。Foo 是一个 DbEntity,而 Bar 包含 Foo 的所有业务逻辑。我可以在 Bar 中使用 Factory 方法,但操作符非常方便!特别是当让 Foo 退出 Bar 以进行 Bar 类之外的数据库操作时。

在试图弄清楚发生了什么时,我偶然发现了这篇文章,这确实很有趣,但没有为这种情况提供任何解决方案。我对这些奇怪的运行时异常了解不多,那么有什么方法可以让我按照我想要的方式将它们分开吗?为 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

在只应引用 Bar 类的程序集的程序集中

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

标签: vb.netcastingruntimeexceptionintermediate-language

解决方案


推荐阅读