我在执行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