有没有办法在.NET中重载属性

时间:2010-02-10 15:37:04

标签: vb.net properties overloading

我已经做了很多方法重载,但现在我有一个实例,我想重载一个属性。 Visual Studio中的IDE似乎允许它,因为我实际上可以设置两个重载,但是我得到一个错误,说它无效,因为它们的类型不同。我想我的语法中缺少一些东西?

我希望能够使用两个(或更多)不同的自定义类作为我的属性的类型。

Public Overloads Property myFlexibleProperty() As myCustomClass1
      Get
         Return _myFlexibleProperty1
      End Get
      Set(ByVal value As myCustomClass1)
         _myFlexibleProperty1 = value
      End Set
   End Property

   Public Overloads Property myFlexibleProperty() As myCustomClass2
      Get
         Return _myFlexibleProperty2
      End Get
      Set(ByVal value As myCustomClass2)
         _myFlexibleProperty2 = value
      End Set
   End Property

到目前为止,我找到的所有帮助都与重载方法有关。尽管IDE让我这么做,我开始认为这是不可能的?

7 个答案:

答案 0 :(得分:18)

重载某些东西 - 方法或属性 - 您需要它接受一组不同的参数。由于VB.NET中的属性可以接受参数,我猜你可以重载它们;但他们必须是不同的。

所以你可以这样做:

Public Overloads Readonly Property Average() As Double
Public Overloads Readonly Property Average(ByVal startIndex As Integer) As Double

但不是这样:

Public Overloads Readonly Property Average() As Double
Public Overloads Readonly Property Average() As Decimal

答案 1 :(得分:2)

这不应该是可能的。您正在有效地尝试创建一个可以返回两种不同类型的属性。系统无法确定您要调用的内容。

您必须为每个人提供唯一的属性名称。

答案 2 :(得分:1)

您的签名是相同的(只有返回类型不同)。编译器不会知道您正在调用哪种方法。那是你的问题。更改签名。

答案 3 :(得分:1)

您是否尝试过使用基于接口的类?然后,您可以基于相同的公共接口和与接口类型关联的属性而不是特定的类本身具有不同的类。

答案 4 :(得分:1)

有一种方法

Public Enum myType
    inInteger = 0
    inDouble = 1
    inString = 2
End Enum

Public Class clsTest
Dim _Value1 As Integer
Dim _Value2 As Double
Dim _Value3 As String

Public Property MyValue(ByVal Typ As myType) As Object
    Get
        Select Case Typ
            Case myType.inDouble
                Return _Value2
            Case myType.inInteger
                Return _Value1
            Case Else
                Return _Value3
        End Select
    End Get
    Set(ByVal value As Object)
        Select Case Typ
            Case myType.inDouble
                _Value2 = value
            Case myType.inInteger
                _Value1 = value
            Case Else
                _Value3 = value
        End Select
    End Set
End Property
End Class

答案 5 :(得分:0)

无法重载属性。话虽这么说,您可以通过创建隐式转换或重载=运算符来完成您想要的任务。

答案 6 :(得分:0)

可以让属性在某个特殊类上运行,这类特殊类支持扩展转换运算符与真实类型的转换。在某些情况下,这可以很好地工作并提供有用的扩展。最大的限制:

  1. 如果特殊的类/结构转换为Object类型,它将不会像它应该被类型转换的那样行为。
  2. 如果特殊的东西是一个类,那么每次获取或设置属性都需要实例化一个新的垃圾收集对象。

但是,在某些情况下,这可能是一个有用的抽象(特别是如果基类型是一个结构)。