使用C#枚举类型创建一个没有0值的实例

5

我需要创建一个没有0值的枚举类实例。如果有0值,下面的代码可以正常工作:

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

枚举:

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

如果我注释掉DUMMY,那么创建实例就不再起作用了。
4个回答

6

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

假设有如下枚举类:

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的实例,即使枚举没有声明它。如果你想要默认为你实际声明的值之一,你需要使用反射来查找它,例如:

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

如果枚举没有任何值定义,它将崩溃。如果要防止这种情况,请使用FirstOrDefault并检查null


1
我建议使用“枚举”方法来构造实例并获取可用值,即Enum.ToObject(type, 0)Enum.GetValues(type) - Joey Adams

5

你的ObjectFactory类存在问题,因为

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

可以正常工作并创建int 0。


你确定吗?因为TomTom说没有0值是不可能的。 - Lieven Cardoen
1
请在发布代码之前尝试它,特别是在声称某些东西“运行良好”之前。没有接受单个字符串参数的Activator.CreateInstance重载。 - Timwi
@Lieven - 就像我一样,试试看。新的枚举只是零值,即使零值映射未定义。我认为Tomtom的意思就像我一样,“不可能不起作用”,而不是“不可能做到这一点”。我不知道为什么人们会对我的答案投反对票... - Simon Mourier
@Timwi - 我实际上尝试过了,但复制回来时出现了错误。它并没有改变问题的根源。如果ObjectFactory能够通过字符串获取类型,则可以创建它而无需零名称。 - Simon Mourier
我已经取消了对你的回答的踩,因为你已经修正了它。能否请你解释一下为什么你要踩我的回答? - Timwi

2
实际上这是不可能的。枚举类型的定义是一个值字段,因此必须有一种方法将其初始化为数字0。

这就是完全错误的。在 .net 中,您可以将任何整数值分配给枚举,无论为其定义了什么值。 - Nick
@Nick,请学会阅读。或逻辑。我从未说过你不能分配任何值。 - TomTom
问题:如何创建一个没有0值的枚举类的实例?你的回答:“实际上这是不可能的。”这绝对是可能的,因为枚举可以有任何值,包括0,即使它没有为其定义零。 - Nick

1

好的,我肯定可以使用None。我从1开始,因为枚举反映了我的数据库中的表。 - Lieven Cardoen

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接