Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/vb.net/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Vb.net 在Visual Basic.NET中,如何列出并调用具有给定自定义属性的所有类函数?_Vb.net_Reflection_Delegates_Custom Attributes - Fatal编程技术网

Vb.net 在Visual Basic.NET中,如何列出并调用具有给定自定义属性的所有类函数?

Vb.net 在Visual Basic.NET中,如何列出并调用具有给定自定义属性的所有类函数?,vb.net,reflection,delegates,custom-attributes,Vb.net,Reflection,Delegates,Custom Attributes,我有一个Windows窗体/Visual Basic.NET应用程序,它基本上充当编辑器。它应该为用户提供的功能之一是能够在其当前项目上运行一组规则,并报告发现的任何问题。这些规则都将由窗体中的BackgroundWorker对象运行,因此可以报告执行进度 我实现这一点的策略是为表单提供一组私有实例方法,这些方法接收用户的项目数据(例如,包含在ProjectData对象中),运行该步骤所需的任何检查,并返回一个对象,该对象包含关于测试的可显示信息以及测试是否通过。(为了便于讨论,让我们调用这个类

我有一个Windows窗体/Visual Basic.NET应用程序,它基本上充当编辑器。它应该为用户提供的功能之一是能够在其当前项目上运行一组规则,并报告发现的任何问题。这些规则都将由窗体中的BackgroundWorker对象运行,因此可以报告执行进度

我实现这一点的策略是为表单提供一组私有实例方法,这些方法接收用户的项目数据(例如,包含在
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...
Private子MyBackgroundWorker\u DoWork(发送者作为对象,e作为DoWorkEventArgs)处理MyBackgroundWorker.DoWork
'TODO:在此处获取所有方法的列表,
'在循环中运行每个项目,并在每个项目之后报告进度。
端接头
“再往下。。。
私有函数SomeCheckToRun(数据作为项目数据)作为检查结果
'在这里检查代码。
端函数
私有函数另一个CheckToRun(数据作为项目数据)作为CheckResult
'在这里检查代码。
端函数
私有函数YetAnotherCheckToRun(数据作为项目数据)作为CheckResult
'在这里检查代码。
端函数
“等等。。。
不过,我在这方面没有太多经验。我知道函数和,但我不知道如何将它们组合在一起以满足我的需要


tl;dr:给定一个类,该类具有多个私有实例函数,这些函数都具有相同的签名,并且都标记有相同的自定义属性,我如何计算有多少个私有实例函数,然后运行每个私有实例函数?

您可以使用反射列出具有自定义属性的所有方法。这是一个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

可以使用反射列出具有自定义属性的所有方法。这是一个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

工作起来很有魅力!这将节省我大量的工作。非常感谢!工作起来很有魅力!这将节省我大量的工作。非常感谢!