在vb中访问Friend类似乎比c#

时间:2016-02-27 17:12:53

标签: c# .net vb.net inheritance

我们有一个现有的vb.net项目,它包含一个服务引用和一个抽象类。该类的一个属性是服务的PortTypeClient。该服务的访问级别是Friend。

MustInherit Public Class BassyBase
    Private _ODQ As New ODQService.odqPortTypeClient

    Public Property ODQClient As Object
        Get
            ODQClient = _ODQ
        End Get
        Set(value As Object)
            _ODQ = value
        End Set
    End Property

    Sub New(url as String)

        Dim remoteAddress = New System.ServiceModel.EndpointAddress(url)
        Dim binding As New BasicHttpBinding
        binding.MaxReceivedMessageSize = Int32.MaxValue
        ODQClient = New ODQService.dalsPortTypeClient(binding, remoteAddress)
        ODQClient.Endpoint.Binding.SendTimeout = New TimeSpan(0, 0, 0, 30)
    End Sub

End Class

使用VB的人已经使用基类数月没有问题。基类位于自己的DLL中。子课程正在单独的项目中构建。我试图从我的C#项目中的基类继承并发现虽然VB人员可以访问ODQ作为ODQService.ODQPortTypeClient,但在C#中我只能访问它作为它的对象。

C#行为对我来说很有意义,因为该服务是一个朋友(内部),并且它位于一个单独的DLL中。 DLL 之外的任何内容都不应该知道服务类类型。但是,不管感觉与否,我仍然需要使用该基类。有没有办法调整基类的项目,以便单独的DLL中的C#子类可以知道类型ODQService.ODQPortTypeClient是什么而不使服务完全公开?也许强制服务的可访问性为Protected Friend(内部)?不知?

1 个答案:

答案 0 :(得分:2)

来自MSDN:

  

[Friend]指定一个或多个声明的编程元素   只能从包含它们的程序集中访问   声明。

     

内部关键字是类型和类型的访问修饰符   成员。内部类型或成员只能在文件中访问   同样的集会...

所以,它们是等价的。发布的代码中没有显示Friend类的内容,但Option Strict On这将无法编译:

...
Public Property ODQClient As Object
    Get
        ODQClient = _ODQ
    End Get
    Set(value As Object)
        _ODQ = value            ' <<< compiler error  
    End Set
End Property
  

Option Strict禁止从Object到ODQService.odqPortTypeClient

的隐式转换

嗯,这很容易解决:

Public Property ODQClient As ODQService.odqPortTypeClient

但那不会编译,因为公共财产试图&#34;促进&#34; odqPortTypeClient的可访问性。

因此,必须使用As ObjectOption Strict Off编译DLL。任何使用它的VB项目都必须依赖后期绑定来访问基类中的属性和方法,这意味着 还有Option Strict Off。这也意味着Intellisense无法提供对底层成员的帮助,因为Type通过属性公开As Object

老实说,如果底层服务是由继承该类的东西使用的,那么服务的访问级别就会被破坏。