0

这可以<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()
  • 活着()

但我没有看到:

  • PrintDateOfDeath()
  • 粉碎ByAGrount()

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

4

1 回答 1

3

我假设您尝试找到Goblin该类的所有方法,如果是这种情况,那么是的,这是反射的正常行为。

扩展方法不是它们设计的类型的成员。如果你这样做Type.[GetType]("Goblin").GetMethods(),你只会得到那里定义的方法。

扩展方法只不过是用特殊属性修饰的静态(在 VB 中共享)方法。所以如果你想找到那些,你需要获取ModuleExtension.

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

于 2012-05-30T13:19:47.640 回答