是否可以对类扩展中的方法使用<Attributes>
?
这是A类
Public Class Goblin
Inherits Monster
Enum goblinsRole
Chief
Grount
End Enum
Public Property name As String
Public Property role As goblinsRole
Private healthPoints As Integer
Public Sub New(into As Integer)
healthPoints = into
End Sub
Public Sub hitBy(damage As Integer)
<...>
End Sub
<ValidationMethod()>
Public Function checkByTheWitchDoctor()
<...>
End Function
<ValidationMethod()>
Public Function isAlive()
<...>
End Function
End Class
以下是此A类的扩展
Module ModuleExtension
<ValidationMethod()>
<Extension()>
Public Sub PrintDateOfDeath(ByVal aGoblin As DomainModelFake.Goblin)
<...>
End Sub
<Extension()>
<ValidationMethod()>
Public Function smashedByAGrount(ByVal aGoblin As DomainModelFake.Goblin) As Boolean
<...>
End Function
End Module
当我使用反射来获取使用此属性标记的方法时,我只获得位于A类定义中的方法列表,而不包含位于扩展中的方法。
总而言之,这意味着我只看到:
但我不请参阅:
这是反射的正常行为吗?它不会搜索扩展名吗?
答案 0 :(得分:3)
我假设你试图找到Goblin
类的所有方法,如果是这样,那么是的,这是反射的正常行为。
扩展方法不是其设计类型的成员。如果你Type.[GetType]("Goblin").GetMethods()
,你将只获得那里定义的方法。
扩展方法只是使用特殊属性修饰的静态(在VB中为Shared)方法。所以如果你想找到那些,你需要得到ModuleExtension
的方法。
如果您在运行时不知道ModuleExtension
的名称,可以尝试在程序集中查找所有静态类型,并在其中搜索标有ExtensionAttribute
的静态方法并接受第一个参数类型为Goblin
。