如何在vb.net项目中声明同名的两个类

如何在vb.net项目中声明同名的两个类,vb.net,class,xml-serialization,subclass,Vb.net,Class,Xml Serialization,Subclass,我从vb.net开始,将我的项目vb6迁移到vb.net。 在我的项目中,我在一个文件中有一个名为a的类,声明如下: Public Class A ..... End Class 在另一个文件中,我必须声明另一个本地使用的类,该类的名称与前面在另一个文件(类A)中声明的类名相同。 但这两个阶层是不同的 然后我尝试了以下方法: Public Class Z Private _a As A Public Property a () As A Get

我从vb.net开始,将我的项目vb6迁移到vb.net。 在我的项目中,我在一个文件中有一个名为a的类,声明如下:

Public Class A
.....
End Class
在另一个文件中,我必须声明另一个本地使用的类,该类的名称与前面在另一个文件(类A)中声明的类名相同。 但这两个阶层是不同的

然后我尝试了以下方法:

Public Class Z
  Private _a As A
    Public Property a () As A
        Get
            Return _a
        Get End
        Set (ByVal value As A)
            _a = value
        End Set
    End Property
End Class Z

Class A
......
End Class
Public Class Z
  Private _a As A
    Public Property a () As A
        Get
            Return _a
        Get End
        Set (ByVal value As A)
            _a = value
        End Set
    End Property

Class A
......
End Class

End Class Z
然后我尝试了以下方法:

Public Class Z
  Private _a As A
    Public Property a () As A
        Get
            Return _a
        Get End
        Set (ByVal value As A)
            _a = value
        End Set
    End Property
End Class Z

Class A
......
End Class
Public Class Z
  Private _a As A
    Public Property a () As A
        Get
            Return _a
        Get End
        Set (ByVal value As A)
            _a = value
        End Set
    End Property

Class A
......
End Class

End Class Z
需要的是,当实例化Z时,我可以访问本地类A 但我有一条错误信息,上面写着:

错误4命名空间“BSSystemControl”中的“C:\TFS\SigaCom\BsControl System 2014\BsSystem\nfe\A.vb”冲突中声明的类“A”和类“A”。C:\TFS\SigaCom\B控制系统2014\BsSystem\nfe\impostoDevol.VB 12 7 B控制

如果我将Class A语句放在Class Z范围内,则得到以下消息:


错误4“A”已在此类中声明为“公共属性A”。C:\TFS\SigaCom\b控制系统2014\BsSystem\nfe\impostoDevol.VB 12 11 b控制您的成员的命名不遵循命名约定。在CAMELCASE中应该命名私有对象,避免在开始、结束时使用“*”字符,也不在中间,公共属性和TitleCase中的类,而且,名称应该是直观的,更大的名称的一种短名称。 其次,我认为你根本不需要为你所暴露的场景设置背景

无论如何,要解决这样一个问题,即只需将具有相同类名的每个类移动到具有不同名称的不同名称空间,这样可以避免歧义,但这种编程方式是不正确的

如果我理解的很好,这就是你想要做的

Public class TopLevelClass

Namespace name1

    Public Class Zclass

        Public Property A As Aclass

        Public Sub New()
            Me.A = New Aclass
        End Sub

        Public NotInheritable Class Aclass
            Public Sub New()
            End Sub
        End Class

    End Class

End Namespace

Namespace name2

    Public Class Zclass

        Public Property A As Aclass

        Public Sub New()
            Me.A = New Aclass
        End Sub

        Public NotInheritable Class Aclass
            Public Sub New()
            End Sub
        End Class

    End Class

End Namespace

End Class

如果您的目标是序列化,那么类名在这方面并不重要。默认情况下,将属性序列化为XML时,可以使用
xmlement(string)
属性覆盖属性名的使用。例如,给定以下结构:

Public Class Z
    Private _a As A2
    <XmlElement("A")> _
    Public Property a () As A2
        Get
            Return _a
        Get End
        Set (ByVal value As A2)
            _a = value
        End Set
    End Property

   Class A2
      '......
   End Class

End Class Z
公共类Z
二等兵
_
公共财产a()作为A2
得到
返回a
结束
设置(ByVal值为A2)
_a=值
端集
端属性
A2类
'......
末级
端类Z
将序列化为与以下内容相同的XML:

Public Class Z
    Private _a As A2
    <XmlElement("A")> _
    Public Property ZZZZ () As A2
        Get
            Return _a
        Get End
        Set (ByVal value As A2)
            _a = value
        End Set
    End Property

   Class A2
      '......
   End Class

End Class Z
Public Class Z
    Private _a As ZZZZ
    <XmlElement("A")> _
    Public Property CDEF () As ZZZZ
        Get
            Return _a
        Get End
        Set (ByVal value As ZZZZ)
            _a = value
        End Set
    End Property

   Class ZZZZ
      '......
   End Class

End Class Z
公共类Z
二等兵
_
公共财产ZZZ()作为A2
得到
返回a
结束
设置(ByVal值为A2)
_a=值
端集
端属性
A2类
'......
末级
端类Z
它还将序列化为与以下内容相同的XML:

Public Class Z
    Private _a As A2
    <XmlElement("A")> _
    Public Property ZZZZ () As A2
        Get
            Return _a
        Get End
        Set (ByVal value As A2)
            _a = value
        End Set
    End Property

   Class A2
      '......
   End Class

End Class Z
Public Class Z
    Private _a As ZZZZ
    <XmlElement("A")> _
    Public Property CDEF () As ZZZZ
        Get
            Return _a
        Get End
        Set (ByVal value As ZZZZ)
            _a = value
        End Set
    End Property

   Class ZZZZ
      '......
   End Class

End Class Z
公共类Z
私人(如ZZZZ)
_
公共财产CDEF()作为ZZZZ
得到
返回a
结束
设置(ByVal值为ZZZZ)
_a=值
端集
端属性
类ZZZZ
'......
末级
端类Z

我的第一个问题是。。。这个命名方案有什么要求吗?也许你可以概括地描述一下你希望达到的目标是什么。这将有助于提供一个有适当背景的合理答案。(注意:VB不区分大小写,因此属性
a
与嵌套类
a
相同)默认情况下,Xml序列化将从属性名称中删除(类型无关紧要,因此可以根据需要命名类)和/或在这些属性上使用XmlElement(字符串)属性。是的。此约定的方案是通过序列化生成将由webservice使用的XML文件。我正在使用XSD创建类。XSD在字段中有:det.imposito.ipi,它有多个字段。同一个XSD有一个字段:det.impostoDevol.ipi有其他字段(实际上只有一个)。这样我就需要有相同的名称空间,有两个ipi类。