2014-02-20 101 views
1

假設我實例化一個像這樣的對象:如果我只有一個包含方法名稱的字符串,可以調用一個方法嗎?

Dim PerformPageSize as New HtmlToRtf.CPageStyle.CPageSize() 

的對象包含了我已經把這樣的一個枚舉的方法的一些成員,我的意思是,枚舉字符串是一樣的方法名稱:

Friend Enum PageSize 
    Auto 
    A3 
    A4 
    A5 
    A6 
    Folio 
    Letter 
    Statement 
End Enum 

而且我通過枚舉作爲參數的方法:

Friend Sub Test(Byval _pagesize as PageSize) 
End Sub 

好了,現在我的意圖(避免書面方式大的選擇情況和d O此efficientlly)是解析枚舉值名稱來調用方法(它具有exactlly同名)

所以我想簡化此:

Friend Sub Test(Byval _pagesize as PageSize) 

    Dim PerformPageSize As New HtmlToRtf.CPageStyle.CPageSize() 

    Select Case PageSize 

     Case PageSize.Auto 
      PerformPageSize.Auto() 

     Case PageSize.A3 
      PerformPageSize.A3() 

     Case PageSize.A4 
      PerformPageSize.A4() 

     Case PageSize.A5 
      PerformPageSize.A5() 

      ' Etc... 

    End Select 

End Sub 

弄成這樣其他:

(我知道,這個代碼有沒有意義,但只是瞭解的想法,因爲我不知道應該如何使用反射或其他任何一個真正的解決方案):

Friend Sub Test(Byval _pagesize as PageSize) 

    Dim PerformPageSize As New HtmlToRtf.CPageStyle.CPageSize() 

    ' Parse the Enum value as the Method from the object 
    Dim Method = PerformPageSize.TryPase(GetType(PageSize), _pagesize).ToString 

    ' Call the equivalent method 
    PerformPageSize.[Method]() 

End Sub 
+0

該代碼使用C#,但無論如何,我試圖翻譯它來測試它沒有成功 – ElektroStudios

+0

[策略模式](http://www.dofactory.com/Patterns/PatternStrategy.aspx)可能更合適。 [切換語句的氣味](http://c2.com/cgi/wiki?SwitchStatementsSmell)。 – thepirat000

回答

4

你ç使用反射像這樣:

Friend Sub Test(Byval _pagesize as PageSize) 

    Dim performPageSize As New HtmlToRtf.CPageStyle.CPageSize() 
    Dim pageType As Type = performPageSize.GetType() 
    Dim method As MethodInfo = pageType.GetMethod(_pagesize.ToString()) 
    If Not method Is Nothing Then 
     method.Invoke(performPageSize, Nothing) 
    End If 

End Sub 

只要方法是公開的,這應該工作。如果沒有,你需要用第二個參數來幫助GetMethod()方法來指定方法的可見性。

+0

謝謝這麼多,只是一個要知道未來的問題,字符串應該區分大小寫? – ElektroStudios

+1

@ElektroStudios:國際海事組織,是的,但如果你想忽略大小寫,請看這個答案:http://stackoverflow.com/a/4010017/74757 –

相關問題