如何用枚举类型更改常量?

时间:2013-12-07 11:59:39

标签: c# .net enums

我正在处理ASP.NET MVC 4应用程序,即使对于这个确切的问题,我认为这是无关紧要的。我将EF 5Code First一起使用,我有实体Menu,其中菜单可以是四种不同类型之一。在我的实体中,菜单的类型声明为

public class Menu
{
    //other properties
    public int Type { get; set; }
}

我已将不同类型声明为常量:

public static class MenuType
{
    public const int Report = 10;
    public const int Contract = 20;
    public const int Taxes = 30;
    public const int Interests = 40;
}

因此,如果我想从Contract类型中获取所有菜单,我就会这样:

unitOfWork.MenuRepository.GetAll().Where(x => x.Type == MenuType.Contract).ToList();

即使它工作正常我想用枚举值更改它,我试过这个:

public static class MenuType
{
    public static enum Types
    { 
        Report = 10,
        Contract = 20,
        Taxes = 30,
        Interests = 40
    }
}

但是从我的代码上面检索相同的记录是:

unitOfWork.MenuRepository.GetAll().Where(x => x.Type == (int)(MenuType.Types.Contract)).ToList();

更难以理解,写作也更多。我已经看到enums的使用方式类似于我使用常量的方式。我不确定,也许我必须实施其他方法。

但是如何在不使查询更难以理解的情况下更改enum值的常量?也许还有一些额外的方法,比如MenuTypeValue("Contract") ...

3 个答案:

答案 0 :(得分:2)

您必须更改Menu类上的属性类型以匹配您声明的新枚举

public class Menu
{
    //other properties
    public Types Type { get; set; }
}

通过这种方式,您可以将枚举与枚举进行比较,您的代码将再次变得美观和清晰。

如果你不能这样做,你可能会更好地坚持int常数,或者你需要一直在int和枚举类型之间进行投射。

答案 1 :(得分:1)

将模型中的属性类型“类型”更改为枚举。 EF5足够智能,可以在内部将其转换为int。

看看这里:http://msdn.microsoft.com/en-us/data/hh859576.aspx

答案 2 :(得分:1)

如果您要做的是让它更具可读性,那么为什么不将逻辑移到存储库类中。

所以你可以打个电话:

unitOfWork.MenuRepository.GetAll(MenuType.Type.Contract);

然后在您的存储库中只有一个方法,如:

List<...> GetAll(MenuType.Type type = null) { ... }

所以现在你仍然可以在没有类型的情况下调用GetAll,因为它是一个可选的参数,但在那个方法中你可以找出你需要返回的内容。你的电话看起来会更清洁。