在.NET的早期阶段,我相信有一个属性可以装饰一个类来指定一个默认属性.
根据我发现的一些文章,这似乎在某个时候已经从框架中被淘汰,因为它有点令人困惑,我可以看到这是怎么回事.
还有,还有另一种方法来获得它提供的功能吗?
它看起来像这样:
<DefaultProperty("Value")> _
Public Class GenericStat
...
Public Property Value() As Integer
...
End Property
...
End Class
Run Code Online (Sandbox Code Playgroud)
这允许你做Response.Write(MyObject)而不是Response.Write(MyObject.Value)......这不是一个非常笨重的例子,但在一些复杂的面向对象的上下文中,它有点可怕.如果有更好的方法,请告诉我.
注意:我不是在寻找Default关键字,它只能用于带参数的属性.
Han*_*ant 30
那么,.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
Run Code Online (Sandbox Code Playgroud)
像这样使用它:
Sub Main()
Dim s As New Sample
Console.WriteLine(s(42))
Console.ReadLine()
End Sub
Run Code Online (Sandbox Code Playgroud)
编译器通过自动发出[DefaultMember]来实现此目的.但是这有一个限制,该属性必须有一个索引参数,专门用于避免语法歧义.明确指定属性时,不会强制执行此限制:
<System.Reflection.DefaultMember("AnotherTest")> _
Public Class Sample
Public ReadOnly Property AnotherTest() As Integer
Get
Return 42
End Get
End Property
End Class
Run Code Online (Sandbox Code Playgroud)
但是,默认成员只能通过允许这种语法的语言作为默认值访问.我不知道.NET中的一个例子,它在COM时代被用过,比如VB6.这也是VB6拥有Set关键字背后的核心原因,它解决了歧义,并指出"我的意思是对象,而不是对象的默认属性".当时很多初学Visual Basic程序员都非常痛苦的语法细节.
C#具有完全相同的规则,但不允许相同的灵活性.您之前可能已经看过索引器:
public class Sample {
public int this[int index] {
get { return index; }
}
}
Run Code Online (Sandbox Code Playgroud)
此代码还使编译器输出[DefaultMember]属性.该属性中的命名属性是"Item".这就是为什么你看到索引器在MSDN Library中记录并索引为"Item"的原因.
小智 10
我发现你可以完全按照原始海报的要求使用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
Run Code Online (Sandbox Code Playgroud)
所以现在
Dim MyObject as GenericStat
MyObject = 123
Run Code Online (Sandbox Code Playgroud)
和
Dim Int as Integer
Int = MyObject
Run Code Online (Sandbox Code Playgroud)
两者都没有.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.您向我们展示的代码可以使用.但是,请注意隐式转换.他们通常不是一个好主意.