创建没有0值的C#Enum实例

时间:2011-01-26 12:55:22

标签: c# reflection enums

我需要创建一个没有0值的Enum类的实例。使用0值,下一个代码可以正常工作:

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

枚举:

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

如果我注释掉DUMMY,则创建实例不再有效。

4 个答案:

答案 0 :(得分:6)

  

我需要创建一个没有0值的Enum类的实例。

假设这样的枚举:

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

您可以创建这样的实例:

ScheduleStateEnum myState = 0;

如果您无法声明类型的变量,并且需要以字符串形式访问该类型(如示例所示),请使用Activator.CreateInstance

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

当然,这两个选项都会为你提供一个实际上具有整数值0的实例,即使枚举没有声明一个。如果您希望它默认为您实际声明的值之一,则需要使用Reflection来查找它,例如:

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

对于没有定义任何值的枚举,这将崩溃。如果您想阻止此操作,请使用FirstOrDefault并检查null

答案 1 :(得分:5)

这是ObjectFactory类的问题,因为

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

工作正常并创建int 0。

答案 2 :(得分:2)

实际上这是不可能的。枚举是一个值字段,因此必须使用0数值初始化它。

答案 3 :(得分:1)

最佳做法是提供零值枚举成员 - 有关详细信息,请参阅http://msdn.microsoft.com/en-us/library/ms182149%28VS.80%29.aspx。你有什么理由不想要零价值的成员,比如无?