2013-10-03 21 views
2

我有一個奇怪的問題,我會先告訴你我的代碼,然後我會問這個問題。使用名稱中的參數調用函數

我有這個開關功能:

switch(index) 
    { 
     case 1: 
     Level1(); 
     break; 
     case 2: 
     Level2(); 
     break; 
     case 3: 
     Level3(); 
     break; 
     case 4: 
     Level4(); 
     break; 
     case 5: 
     Level5(); 
     break; 
    } 

,你可以看到,每個索引調用名爲「級別」和索引號fcuntion。

我可以把所有這些代碼放在一行中,比如「Level + index()」是否有可能?

+10

使用參數調用函數有一種更簡單的方法:將其作爲參數。 '級別(索引)' – nmclean

+0

儘管你評論過很長時間,但我只是想說明一下,我創建了多個void函數來安排數據類型和它們的值,否則我會將數據安排在開關功能,什麼似乎不舒服,不美觀...... –

回答

6

試試這個:

typeof(yourClassCOntainingLevel1Method).GetMethod("Level"+index).Invoke(this,null); 

yourClassCOntainingLevel1Method就是你有Level1方法

如果一個類名它與呼叫在同一類:

typeof(this).GetMethod("Level"+index).Invoke(this,null); 
+0

你的答案實際上是我所需要的,雖然我得到一個錯誤:「只有賦值調用增量遞減和新的對象表達式可以用作一個語句」 –

+0

@OriFrish現在檢查 – wudzik

+1

它工作得很好,我所需要做的就是將方法聲明爲Public。 typeof(this).GetMethod(「Level」+ index).Invoke(this,null); (需要將其替換爲類名稱) –

4

實現此目的的唯一方法是通過反射。不過,這將是最好有一個單級函數,它的級別參數:

public void Level(int number) 
{ 
    ... 
} 
10

不是克,沒有。您可能使用代表:

// Ideally make this a readonly field. 
Action[] actions = { Level1, Level2, Level3, Level4, Level5 }; 
... 
actions[index - 1](); 

或者你可以使用反射,如其他人所說的......但我會盡量避免,如果可能的話,特別是如果性能是一個問題。

儘管它確實感覺像一個奇怪的設計 - 我會後退一步,考慮是否有一個更清潔的方式來設計這個開始。 (目前我們很難在沒有更多上下文的情況下提供幫助。)

+0

它似乎是調用方法的好方法,我還會再次通過我的代碼來檢查一個更好的選項,實際上做的是在每個改變類屬性的方法中創建向量和點以設置關卡。 我使用Unity3D,如果這是以任何方式幫助你。 –

1

請嘗試使用下面的代碼片段。

Type thisType = this.GetType(); 
MethodInfo theMethod = thisType.GetMethod("Level"+index); 
theMethod.Invoke(this, userParameters); 
0

我認爲最好的方法是由Jon Skeet回答的代表。此外,我們可以嘗試使用反射,但這不是由於性能受到影響的最佳做法。

相關問題