在.NET的早期,我相信有一个属性,你可以装饰一个类,指定一个默认属性。
根据我发现的一些文章,这似乎是从框架在某个时候被嘲笑,因为它是一个有点混乱,我可以看到这是这样的情况。
但是,有没有另一种方式来获得它提供的功能?
它看起来像这样:
<DefaultProperty("Value")> _ 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]来实现这一点。然而这有一个限制,属性必须有一个索引参数,特别是为了避免语法歧义。在明确指定属性时不强制执行此限制:
<System.Reflection.DefaultMember("AnotherTest")> _ 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库中记录和索引为“项目”。