2012-04-05 168 views
3

我在試圖製作一個簡單的Roguelike遊戲來學習C#更好一些。我試圖製作一個通用的方法,我可以將它作爲一個參數賦予一個Enum,並將返回該Enum中有多少個元素作爲int。我需要儘可能通用,因爲我將有幾個不同的類調用該方法。傳遞一個Enum作爲參數

找遍了周圍的最後一個小時左右,但我無法在這裏找到任何資源或其他相當多回答我的問題...我仍然在爲C#初學者,中級階段,所以我仍在學習的東西所有的語法,但這裏是我到目前爲止有:

// Type of element 
public enum ELEMENT 
{ 
    FIRE, WATER, AIR, EARTH 
} 


// Counts how many different members exist in the enum type 
public int countElements(Enum e) 
{ 
    return Enum.GetNames(e.GetType()).Length; 
} 


// Call above function 
public void foo() 
{ 
    int num = countElements(ELEMENT); 
} 

它編譯出現錯誤「參數1:無法從‘的System.Type’到‘System.Enum’轉換」。我有點明白爲什麼它不會工作,但我只需要一些方向來正確設置一切。

謝謝!

PS:是否可以在運行時更改枚舉的內容?程序正在執行?

+1

什麼會改變在運行時枚舉的目的是什麼?沒有代碼會使用添加的值,並且使用修改/刪除值的代碼會中斷。如果您想要在運行時動態更改數據元素的列表,請使用數據庫。 – David 2012-04-05 00:46:39

+0

我試圖在較小規模上效仿矮人堡壘。您可以通過遊戲在啓動時解析的某種平面文本文件來更改各種東西。不知道他們究竟是如何設置的,儘管我的猜測是,如果你必須對Enums進行硬編碼以與它們一起工作,那麼它不會與它們在一起......字典呢? – 2012-04-05 01:34:58

回答

7

試試這個:

public int countElements(Type type) 
{ 
    if (!type.IsEnum) 
     throw new InvalidOperationException(); 

    return Enum.GetNames(type).Length; 
} 

public void foo() 
{ 
    int num = countElements(typeof(ELEMENT)); 
} 
+0

安東尼:完美,編譯和按預期工作。 :D 大衛:我試圖在較小規模上效仿矮人堡壘。您可以通過遊戲在啓動時解析的某種平面文本文件來更改各種東西。不知道他們是如何設置的,儘管我的猜測是,如果你必須對Enums進行硬編碼來處理它們,那麼它就不會與它們一起使用。 – 2012-04-05 00:54:33

+1

我不知道關於一個類型的IsEnum,它從4.0開始就已經出現了。這很好。 – 2015-08-06 20:00:43

3

你也可以用一個通用的方法做到這一點。我個人喜歡的語法爲foo()方法這樣更好,因爲你沒有指定typeof()

// Counts how many different members exist in the enum type 
    public int countElements<T>() 
    { 
     if(!typeof(T).IsEnum) 
      throw new InvalidOperationException("T must be an Enum"); 
     return Enum.GetNames(typeof(T)).Length; 
    } 

    // Call above function 
    public void foo() 
    { 
     int num = countElements<ELEMENT>(); 
    }