这可以在类扩展中设置属性吗?

时间:2012-05-30 10:22:16

标签: vb.net reflection attributes extension-methods

是否可以对类扩展中的方法使用<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类定义中的方法列表,而不包含位于扩展中的方法。

总而言之,这意味着我只看到:

  • checkByTheWitchDoctor()
  • 的IsAlive()

但我请参阅:

  • PrintDateOfDeath()
  • smashedByAGrount()

这是反射的正常行为吗?它不会搜索扩展名吗?

1 个答案:

答案 0 :(得分:3)

我假设你试图找到Goblin类的所有方法,如果是这样,那么是的,这是反射的正常行为。

扩展方法是其设计类型的成员。如果你Type.[GetType]("Goblin").GetMethods(),你将只获得那里定义的方法。

扩展方法只是使用特殊属性修饰的静态(在VB中为Shared)方法。所以如果你想找到那些,你需要得到ModuleExtension的方法。

如果您在运行时不知道ModuleExtension的名称,可以尝试在程序集中查找所有静态类型,并在其中搜索标有ExtensionAttribute的静态方法并接受第一个参数类型为Goblin