通过“复制它”,我认为它是指如何使用自定义属性。首先定义属性:
Public Class FormattedAttribute
Inherits Attribute
Private _flag As Boolean = False
Public Sub New(ByVal b As Boolean)
_flag = b
End Sub
Public ReadOnly Property IsFormatted() As Boolean
Get
Return _flag
End Get
End Property
End Class
属性(通常)只是一个小而简单的类,它继承自Attribute
. 这将简单地在枚举上存储一个真/假标志:
Friend Enum MyEnum
...
<Formatted(True)> FileSize
...
Enum
注意: 约定是定义附加Attribute
到名称的类。但在使用中,可以放弃。
属性是编译到您的应用程序中的元数据。他们提供一些关于类、属性、方法等的信息。他们自己不做任何事情。目标(类、属性等)不知道附加到它的任何属性:一个DefaultValue
或Range
属性本身不做任何事情——它们是供其他东西读取和使用的。
接下来,您需要一种从以下位置读取/获取该标志的方法FormattedAttribute
:
Friend Shared Function GetFormatFlag(ByVal EnumConstant As [Enum]) As Boolean
Dim fi As FieldInfo = EnumConstant.GetType().GetField(EnumConstant.ToString())
Dim attr() As FormattedAttribute= _
DirectCast( _
fi.GetCustomAttributes(GetType(FormattedAttribute), False), _
FormattedAttribute())
If attr.Length > 0 Then
Return attr(0).IsFormatted
Else
Return False
End If
End Function
这个长版本允许该属性在您正在搜索的类型上可能存在也可能不存在(就像实际使用的情况一样)。在代码中,通过调用GetFormatFlag
:
IsFormatted = GetFormatFlag(mi)
如果您知道该属性存在,则有一种更简单的方法:
Friend Shared Function GetMyKey() As String
Dim myAttr As myAttribute
myAttr = CType(Attribute.GetCustomAttribute(GetType(myClass), _
GetType(myAttribute)), myAttribute)
Return myAttr.Key
End Function
可以修改短版本以myAttribute
通过传递类型从任何实现它的类中获取值/键,但这与属性一样灵活。
它们可以与程序集、类、方法和字段以及使它们重新使用的方式一起使用System.Reflection
,并且会因类型而有所不同,但基本相同。
它们不适合在类或属性中嵌入数据,因为没有一种适合它们的尺寸:每个属性都需要自己的类定义和读取器方法。