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

Lie*_*oen 4 c# reflection enums

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

ObjectFactory.CreateInstance("Edu3.DTOModel.Schedule.ScheduleStateEnum");
Run Code Online (Sandbox Code Playgroud)

枚举:

namespace Edu3.DTOModel.Schedule
{
    public enum ScheduleStateEnum
    {
        DUMMY = 0,
        Draft = 1,
        Published = 2,
        Archived = 3
    }
}
Run Code Online (Sandbox Code Playgroud)

如果我注释掉DUMMY,则创建实例将不再起作用.

Tim*_*mwi 6

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

假设这样的枚举:

public enum ScheduleStateEnum
{
    Draft = 1,
    Published = 2,
    Archived = 3
}
Run Code Online (Sandbox Code Playgroud)

你可以创建一个像这样的实例:

ScheduleStateEnum myState = 0;
Run Code Online (Sandbox Code Playgroud)

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

var myState = Activator.CreateInstance(Type.GetType(
                  "Edu3.DTOModel.Schedule.ScheduleStateEnum"));
Run Code Online (Sandbox Code Playgroud)

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

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

对于没有定义任何值的枚举,这将崩溃.使用FirstOrDefault并检查null是否要阻止此操作.


Sim*_*ier 5

这是ObjectFactory类的问题,因为

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

工作正常并创建int 0.