vb.net - 转换运算符的转换错误
问题描述
在执行 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
解决方案
推荐阅读
- python - 如何将消息连续发送到异步套接字 - (Python 和 C#)
- normal-distribution - 我怎样才能适应批量操作的多元法线?
- swift - SwiftUI Stepper 放入“.” 整数
- ruby-on-rails - 有很多通过关联
- django - Django重复列名:用户名
- ios - 在给定的一天中获取每分钟的数组的最有效方法是什么?
- unity3d - Unity 脚本不继承可以管理脚本的原生类
- flutter - Flutter 检查器在 Visual Studio Code 中出现故障/冻结
- c# - 如何在不点击的情况下将播放器移动到光标?
- c# - 来自 Prism.AppModel 的 IAutoInitialize 接口问题导致我的弹出窗口没有文本