【问题标题】:Understanding Enums - using as constants理解枚举 - 用作常量
【发布时间】:2013-04-23 20:19:02
【问题描述】:

所以我尝试使用枚举,可能是错误的方式,因为我来自 PHP。在 C# 中,我有一个全局类:

public static class GlobalTypes
{
    public enum assignmentType { SERV = "SERV", PROD = "PROD", PER = "PER", }
}

从那里我尝试通过以下方式与实体交互:

    public static IEnumerable<Person> getAllAgents(int id)
    {
        using (var db = new LocAppContext())
        {
            var person = (from p in db.Person
                          join la in db.LocationAssignment on p.id equals la.value
                          where la.locationID == id && la.type == GlobalTypes.assignmentType.PER
                          select p).ToList();

            return person;
        }

    }

但我得到了错误:

运算符“==”不能应用于“字符串”类型的操作数和 'LocApp.Helpers.Classes.LocationAssignments.GlobalTypes.assignmentType'

发生在

la.type == GlobalTypes.assignmentType.PER

我的逻辑,这来自 php,是我想要一个全局常量,我可以在任何地方调用以在调用时“回显”该常量的值,因此常量值可以更改,但我不必在一百万个地方改变它。

想法?

【问题讨论】:

  • 只需放弃= "SERV" 部分,就可以了。这是一些关于 C# 中枚举用法的 MSDN 文档:msdn.microsoft.com/en-ca/library/vstudio/cc138362.aspx 编辑:另外,您的 la.type 应该定义为 GlobalTypes.assignmentType 而不是字符串。
  • 枚举不是字符串,C# 不是 PHP。
  • @ChrisSinclair 所以你是说我能做到:&amp;&amp; GlobalTypes.assignmentType ??它会知道我想要什么?
  • 我认为你应该只使用public const 值,因为(正如人们已经说过的)C# 中的 emuns 不能是字符串(它们只能是整数类型:byte、short、ushort , int, uint, long, ulong)。
  • @TheWebs 不,我的意思是您的 LocationAssignments.type 属性应该输入为 GlobalTypes.assignmentType 而不是字符串,那么您的 LINQ 查询仍然看起来像它一样(我相信)。针对enum 而不是作为字符串键入的好处是(有助于)防止分配垃圾数据(不能意外分配“ASDF”或“SomeAssignmentTypeThatDoesNotExist”)。这样做仍然可能,但更难(您通常必须尝试在那时分配垃圾数据)

标签: c# entity-framework enums


【解决方案1】:

如果你想要常量字符串,那么不要使用枚举。枚举用于整数类型。只需使用 consts:

public static class MyClass
{
    public const string PROD = "PROD";
    public const string DEV = "DEV";
}

// elsewhere...
la.type == MyClass.PROD;

【讨论】:

    【解决方案2】:

    快速回答:

    public enum assignmentType { SERV, PROD, PER }
    

    并在比较中(假设 la.type 返回一个字符串):

    where la.locationID == id && la.type == GlobalTypes.assignmentType.PER.ToString()
    

    【讨论】:

    • 即使您不必使用枚举,为什么不想这样做?使用枚举听起来是解决这个问题的完美解决方案。
    • 问题:LINQ to Entities 无法识别方法“System.String ToString()”方法,并且该方法无法转换为存储表达式。 la.type,之前是:la.type == "PER" 所以是的,它是一个字符串,但错误仍然存​​在
    • 同意@Servy。枚举是一个很好的解决方案,因为它被用于对 3 个值进行分组。像其他人建议的那样使用常量会删除分组。也许使用 ToString 并保存到查询中使用的临时字符串。枚举以便在代码的其他地方重用是有意义的。
    • 我同意,评论已修改。
    • 问题仍然存在@CaptainSkyhawk,即使 .type 是字符串,我也无法使用 .ToString() 将其转换为字符串。
    猜你喜欢
    • 2019-12-02
    • 2016-11-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-08-21
    • 1970-01-01
    • 2012-06-19
    • 1970-01-01
    相关资源
    最近更新 更多