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()
  • smashedByAGround()

これは反射の通常の動作ですか? 拡張機能を検索しませんか?

4

1 に答える 1

3

クラスのすべてのメソッドを見つけようとしていると仮定していますGoblin。そうであれば、そうです。これはリフレクションの通常の動作です。

拡張メソッドは、設計された型のメンバーではありません。実行するとType.[GetType]("Goblin").GetMethods()、そこで定義されたメソッドのみが取得されます。

拡張メソッドは、特別な属性で装飾された静的 (VB で共有) メソッドに他なりません。したがって、それらを見つけたい場合は、 のメソッドを取得する必要がありますModuleExtension

実行時にの名前がわからない場合は、アセンブリ内のすべての静的型を検索して、 でマークされ、 type の最初のパラメーターを受け入れるModuleExtension静的メソッドを検索することができます。 ExtensionAttributeGoblin

于 2012-05-30T13:19:47.640 に答える