2017-05-11 85 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

就像一个魅力!这将为我节省大量的工作。万分感谢! –

相关问题