在.NET的早期阶段,我相信有一个属性可以装饰一个类来指定一个默认属性.
根据我发现的一些文章,这似乎在某个时候已经从框架中被淘汰,因为它有点令人困惑,我可以看到这是怎么回事.
还有,还有另一种方法来获得它提供的功能吗?
它看起来像这样:
_ Public Class GenericStat ... Public Property Value() As Integer ... End Property ... End Class
这允许你做Response.Write(MyObject)
而不是Response.Write(MyObject.Value)
......这不是一个非常笨重的例子,但在一些复杂的面向对象的上下文中,它有点可怕.如果有更好的方法,请告诉我.
注意:我不是在寻找Default关键字,它只能用于带参数的属性.
那么,.NET框架确实有一个默认成员的概念.主要成分是DefaultMemberAttribute类和Type.GetDefaultMembers().在VB.NET中,指定默认成员是语言语法的一部分:
Public Class Sample Private mValue As Integer Default Public ReadOnly Property Test(ByVal index As Integer) As Integer Get Return index End Get End Property End Class
像这样使用它:
Sub Main() Dim s As New Sample Console.WriteLine(s(42)) Console.ReadLine() End Sub
编译器通过自动发出[DefaultMember]来实现此目的.但是这有一个限制,该属性必须有一个索引参数,专门用于避免语法歧义.明确指定属性时,不会强制执行此限制:
_ Public Class Sample Public ReadOnly Property AnotherTest() As Integer Get Return 42 End Get End Property End Class
但是,默认成员只能通过允许这种语法的语言作为默认值访问.我不知道.NET中的一个例子,它在COM时代被用过,比如VB6.这也是VB6拥有Set关键字背后的核心原因,它解决了歧义,并指出"我的意思是对象,而不是对象的默认属性".当时很多初学Visual Basic程序员都非常痛苦的语法细节.
C#具有完全相同的规则,但不允许相同的灵活性.您之前可能已经看过索引器:
public class Sample { public int this[int index] { get { return index; } } }
此代码还使编译器输出[DefaultMember]属性.该属性中的命名属性是"Item".这就是为什么你看到索引器在MSDN Library中记录并索引为"Item"的原因.
我发现你可以完全按照原始海报的要求使用Widening Operator CType
上面提到但没有太多细节,所以我完全错过了它,因为我试图找到这个问题的答案.此方法本身并未定义默认属性,但它实现了相同的结果.
Public Class GenericStat ... Public Property Value() As Integer ... End Property ... 'this could be overloaded if needed Public Sub New(ByVal Value As Integer) _Value = Value End Sub ' Public Shared Widening Operator CType(ByVal val As Integer) As GenericStat Return New GenericStat(val) End Operator ' Public Shared Widening Operator CType(ByVal val As GenericStat) As Integer Return val.Value End Operator End Class
所以现在
Dim MyObject as GenericStat MyObject = 123
和
Dim Int as Integer Int = MyObject
两者都没有.Value
参考,也没有像索引这样的索引器myobject(1)
不,这是从VB 7中明确删除的.
当您拥有一长串默认属性时,确切地知道将返回的内容很难.当两个b
和c
有Foo
方法,也a.Foo(1)
指a.b.Foo(1)
或a.b.c.Foo(1)
?
真正的踢球者是Set
.通过删除默认属性,他们还可以删除Set
对象分配的关键字.
在此示例中,它会拉取对象,但不会将其转换为整数.
布赖恩,我不明白为什么使用a无法实现你想要的效果Widening Operator CType
.您向我们展示的代码可以使用.但是,请注意隐式转换.他们通常不是一个好主意.