2012-05-30 54 views
0

對於Class擴展中的方法,可以使用<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 

下面是這個類的一個擴展名的

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類定義中的方法列表中沒有位於擴展名中的方法。

在extenso,這意味着我只看到:

  • checkByTheWitchDoctor()
  • 的IsAlive()

但我見:

  • PrintDateOfDeath ()
  • smashedByAGrount()

這是正常的反射行爲嗎?它不搜索擴展?

+0

試試看,並附上代碼。 –

+0

@Romil什麼讓你覺得我沒有嘗試? –

回答

3

我假設你試圖找到Goblin類的所有方法,如果是這樣的話,那麼是的,這是反射的正常行爲。

擴展方法是而不是它們的設計類型的成員。如果你這樣做Type.[GetType]("Goblin").GetMethods(),你只會得到在那裏定義的方法。

擴展方法只是用特殊屬性裝飾的靜態(Shared in VB)方法。所以如果你想找到那些,你需要得到ModuleExtension的方法。

如果你不知道的ModuleExtension在運行時的名稱,你可以嘗試尋找所有靜態類型的彙編,並搜索那些標有ExtensionAttribute靜態方法和接受Goblin類型的第一個參數。

+0

如果我不知道一個類是否被擴展,是否有任何方法可以獲得方法名(在這個擴展中),如果它們被正確標記的話?因爲我不知道這個「ModeleExtension」的名字...... –

+0

@Rabskatran用一種可能的方法編輯我的答案。你爲什麼不知道模塊的名字?通常擴展方法是編譯時的概念。 – Botz3000