2011-01-26 33 views
4

我需要創建一個沒有0值的Enum類的實例。數值爲0,下一個代碼工作正常:創建一個沒有0值的C#枚舉的實例

ObjectFactory.CreateInstance("Edu3.DTOModel.Schedule.ScheduleStateEnum"); 

枚舉:

namespace Edu3.DTOModel.Schedule 
{ 
    public enum ScheduleStateEnum 
    { 
     DUMMY = 0, 
     Draft = 1, 
     Published = 2, 
     Archived = 3 
    } 
} 

如果我註釋掉假人,創建實例不工作了。

回答

6

我需要創建一個沒有0值的Enum類的實例。

假設這樣一個枚舉:如果您不能聲明類型的變量,而您需要訪問類型

ScheduleStateEnum myState = 0; 

public enum ScheduleStateEnum 
{ 
    Draft = 1, 
    Published = 2, 
    Archived = 3 
} 

您可以創建這樣一個實例作爲一個字符串(如你的例子),使用Activator.CreateInstance

var myState = Activator.CreateInstance(Type.GetType(
        "Edu3.DTOModel.Schedule.ScheduleStateEnum")); 

當然,即使枚舉不聲明一個,這兩個選項都會給你一個實際上具有整數值0的實例。如果你想讓它默認爲您已實際聲明的一個值,你需要使用反射來找到它,例如:

var myState = Type.GetType("Edu3.DTOModel.Schedule.ScheduleStateEnum") 
        .GetFields(BindingFlags.Static | BindingFlags.Public) 
        .First() 
        .GetValue(null); 

這會崩潰對具有根本沒有定義的值枚舉。如果您想防止這種情況,請使用FirstOrDefault並檢查null

5

這是一個與你的ObjectFactory類問題,因爲

Activator.CreateInstance(typeof(Edu3.DTOModel.Schedule.ScheduleStateEnum))

正常工作,並創建INT 0

+0

你確定,因爲TomTom說沒有0值就不可能。 – 2011-01-26 13:13:40

+1

請在發佈之前嘗試您的代碼,特別是在宣稱某些「正常工作」之前。 Activator.CreateInstance沒有重載一個字符串。 – Timwi 2011-01-26 13:43:47

+0

@Lieven - 就像我一樣嘗試。即使未定義零值映射,新的枚舉也只是零值。我認爲Tomtom的意思是說我「這不可能不起作用」,而不是「這不可能做到這一點」。我不知道爲什麼人們低估了我的答案... – 2011-01-26 13:47:05

2

其實這是不可能的。枚舉是每個定義一個值字段,所以它不得不用一個0數字值來初始化它。