2010-05-21 56 views
0

我試圖創建一個類,作爲一個靈活的枚舉。 我帶着這個想法來了兩個額外的靜態方法,它們允許我將新成員添加到該列表中,並只從該列表中獲取成員。C#假枚舉TypeInitializationException異常

public class LikeEnum 
{ 
     private static List<LikeEnum> list = new List<LikeEnum>() 
     { new LikeEnum("One"), new LikeEnum("Two") }; 

     private string value; 

     private LikeEnum(string value) 
     { 
       this.value = value; 
     } 
} 

不幸的是,清單列表只初始化爲空,因此這不工作...

任何意見或建議?

+0

的可能重複[C#:你能添加到一個枚舉類型在運行時(http://stackoverflow.com/questions/2779743/c- can-you-add-to-an-enum-type-in​​-run-time) – 2010-05-21 00:45:16

回答

4

不幸的是,清單列表只初始化爲空,因此這不工作...

不,它不是「初始化爲空」。它只是從未初始化......靜態構造函數(隱式在你的情況下)只在類的第一次訪問靜態字段時執行。因爲你不能創建一個實例(構造函數是私有的),並且沒有公共靜態成員,所以該類保持未初始化...

無論如何,對於你想要做的事情,List<LikeEnum>不是很有用...一個更好的選擇,如果你希望它像一個枚舉,是創建靜態只讀域:

public class LikeEnum 
{ 
    public static readonly LikeEnum One = new LikeEnum("One"); 
    public static readonly LikeEnum Two = new LikeEnum("Two"); 

    private string value; 

    private LikeEnum(string value) 
    { 
     this.value = value; 
    } 
} 

編輯:順便說一下,我想你沒有張貼類的完整代碼?隨着你發佈的代碼,沒有辦法得到TypeInitializationException,因爲該類型將永遠不會被初始化...

+0

如果它允許我添加新的「枚舉」,並且我認爲它不會,是的,我只是張貼一小段摘錄。 – userk 2010-05-21 00:43:06

+0

不,不可能以這種方式添加新的「枚舉值」......但無論如何,您打算如何使用該類?枚舉點是這些值是預定義的,因此在運行時向枚舉值添加新值是沒有意義的 – 2010-05-21 01:08:14

1

繼承人一個更常見的模式,你正在嘗試做什麼,我記得它是在java 1.5

public sealed class LikeEnum 
{ 
    public static readonly LikeEnum One = new LikeEnum("one"); 
    public static readonly LikeEnum Two = new LikeEnum("Two"); 

    private string value; 
    private LikeEnum(string v) 
    { 
     value = v; 
    } 
} 

因爲類是sealed和構造函數是私有的,可以創建的唯一枚舉是那些你指定。

0

既然你說enum我假設你也想在switch聲明中使用它們。下面是允許你做一個例子:

public struct LikeEnum 
{ 

     public const string One = "One"; 
     public const string Two = "Two"; 

     private readonly string value; 

     private LikeEnum(string value) 
     { 
       this.value = value; 
     } 

     public static implicit operator LikeEnum(string value) { 
      return new LikeEnum(value); 
     } 

     public static implicit operator string(LikeEnum le) { 
      return le.value; 
     } 
} 

//In the code 
LikeEnum le = new LikeEnum("One"); 
switch(le) { 
case LikeEnum.One: 
    //do something 
    break; 
}