2017-05-11 17 views
0

기본적으로 편집기로 작동하는 Windows Forms/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 attributesFunc(T, TResult) delegate에 대해 알고 있지만, 원하는 모든 것을 모으는 방법을 잘 모르겠습니다.

TL; DR : 내가 얼마나 많은 계산하고 각 하나를 실행할 수있는 동일한 사용자 지정 특성으로 표시된 동일한 서명 및 모든 다음과 같은 여러 개인 인스턴스 기능을 가진 클래스를 감안할 때?

답변

2

Reflection을 사용하여 사용자 지정 특성이있는 모든 메서드를 나열 할 수 있습니다. 이것은 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

작품! 이것은 저에게 많은 돈을 절약 할 것입니다. 엄청 고마워! –