2017-05-11 50 views
0

我有一個基本上充當編輯器的Windows窗體/ Visual Basic .NET應用程序。它應該爲用戶提供的功能之一是能夠在他們當前的項目上運行一組規則並報告發現的任何問題。這些規則將全部由生活在表單中的BackgroundWorker對象運行,因此可以報告執行進度。在Visual Basic .NET中,如何使用給定的自定義屬性列出和調用所有類函數?

我的策略是爲表單提供一些私有實例方法,它們接收用戶的項目數據(包含在ProjectData對象中),運行該步驟所需的任何檢查,然後返回包含有關測試的可顯示信息的對象以及它是否通過測試。 (爲討論目的,我們稱這個類爲CheckResult)。所以,僅僅是明確的,所有的這些方法將有沿行的簽名:

Private Function SomeCheckToRun(data As ProjectData) As CheckResult 

可以只是定義所有這些方法像往常一樣和手動一一列舉出來一個接一個被在BackgroundWorker的DoWork事件處理函數中調用,但是這種方法似乎會對可能的大量檢查變得乏味。如果我可以定義每個我想要運行的方法並將其裝飾爲好,那麼這將會很好,因此循環可以自動找到每個這樣的方法定義並運行它。

我在想,我想要做的是改爲定義一個自定義屬性類,用於指示哪些實例方法將作爲檢查運行(可能稱爲CheckToRunAttribute),然後以某種方式使用反射來獲取所有這些方法當前都以表單的形式實現,並按順序執行每個方法,可能是通過設置委託來爲每個方法運行。 BackgroundWorker可以使用總共這些方法的數量以及到目前爲止已經執行了多少個方法來指示整體進度。

到目前爲止,我的代碼的結構將類似於在我記住以下幾點:

Private Sub MyBackgroundWorker_DoWork(sender As Object, e As DoWorkEventArgs) Handles MyBackgroundWorker.DoWork 
    ' TODO: Get a list of all the <CheckToRun()> methods here, 
    '  run each one in a loop, and report progress after each one. 
End Sub 

' Further down... 

<CheckToRun()> 
Private Function SomeCheckToRun(data As ProjectData) As CheckResult 
    ' Check code in here. 
End Function 

<CheckToRun()> 
Private Function AnotherCheckToRun(data As ProjectData) As CheckResult 
    ' Check code in here. 
End Function 

<CheckToRun()> 
Private Function YetAnotherCheckToRun(data As ProjectData) As CheckResult 
    ' Check code in here. 
End Function 

' And so on... 

這不是我有這樣做雖然很多經驗。我知道Type.GetMethods()功能,how to write custom attributes,和Func(T, TResult) delegate,但我不知道如何把它放在一起爲我想要的。

tl; dr:給定一個具有多個私有實例函數的類,它們在相同的簽名之後,並且都用相同的自定義屬性標記,我如何計算有多少個,然後運行每個函數?

回答

2

您可以使用反射以您的自定義屬性列出所有方法。這是一個LINQ的解決方案:

Dim methods = Me.GetType.GetMethods(Reflection.BindingFlags.NonPublic Or Reflection.BindingFlags.Instance)_ 
         .Where(Function(m) m.GetCustomAttributes(GetType(CheckToRun), False)_ 
         .Length > 0).ToArray() 

然後運行它們喜歡:

For Each method As Reflection.MethodInfo In methods 
    method.Invoke(Me, New Object() {methodParams}) 
Next 
+0

就像一個魅力!這將爲我節省大量的工作。萬分感謝! –

相關問題