【问题标题】:Enum with default typecast? is that possible?具有默认类型转换的枚举?那可能吗?
【发布时间】:2009-05-18 09:09:37
【问题描述】:

是否可以为枚举进行默认类型转换?

我经常使用枚举,例如状态,我想将枚举直接与 LINQ 字段进行比较,但我必须一直进行类型转换。

【问题讨论】:

    标签: c# asp.net linq linq-to-sql enums


    【解决方案1】:

    您应该能够在具有枚举类型的 LINQ 对象中拥有属性。这样你就不必投射了。

    因此,只需更改您的属性以具有正确的枚举类型,您就不必再担心强制转换了。您可以在 LINQtoSQL 设计器中执行此操作。只需右键单击一个属性,选择“属性”并在 Visual Studio 属性窗口中设置适当的类型。

    【讨论】:

    • 不,它们通常是 tinyint,因为我没有超过 5 到 20 个不同的值。
    • 在这种情况下,您应该将它们的类型更改为它们实际的枚举类型。 LINQtoSQL 将正确处理此问题。
    • 请原谅我的愚蠢问题,但我该在哪里更改它们的类型?
    • 我在回答中添加了更多信息。
    【解决方案2】:

    答案要简单得多!!!

    我的一个好朋友告诉我这很简单!看看这个样本!

    public enum State:byte
    {
        EmailNotValidated = 0x00,
        EmailValidated = 0x10,
        Admin_AcceptPending = 0x40,
        Active = 0x80,
        Admin_BlockedAccount = 0xff
    }
    

    注意枚举名称后面的 :BYTE 部分...这是我正在寻找的技巧!但是感谢所有为我努力的人!

    【讨论】:

    • 感谢大家的宝贵时间!
    【解决方案3】:

    LINQ-to-SQL 通常会处理直接整数映射和精确字符串(名称)映射(注意:区分大小写)。含义:在某处写你的枚举,并在设计器中将属性类型设置为完全限定的枚举名称:Some.Namespace.MyEnum。它通常应该可以工作。

    对于非平凡的映射(例如,列是具有混合大小写值的 varchar,或诸如“进行中”[注意空格]之类的内容),您必须将存储属性保留为 int/ varchar(等)并手动映射。我通常通过将其标记为私有并将其命名为FooStorage 并在部分类中添加映射属性来做到这一点:

    partial class MyType {
        public MyEnum Foo {
            get {... mapping logic reading from FooStorage...}
            set {... mapping logic, updating FooStorage...}
        }
    }
    

    唯一的问题是 LINQ 查询只能针对 storage 属性(而不是定制属性)。

    【讨论】:

    • 我的原始问题是我习惯于拥有大量枚举,但是当我这样做时:oTabel.State = someEnum.SomeState;我必须写:oTabel.State = (byte)someEnum.SomeState;每次...我不能将“SomeEnum”设为默认 (BYTE)-cast 吗?
    • 您为什么不通过设计器告诉系统将 State 视为 SomeEnum 呢?但是不行:你不能在枚举中添加隐式转换运算符(0 除外,它总是有隐式转换)。
    【解决方案4】:

    你尝试过扩展方法吗?

    public enum MyEnum
    {
        First = 1,
        Second = 2,
        Third = 3
    }
    
    public static class Utility
    {
        public static string Description(this Enum e)
        {
            Type t = e.GetType();
            DescriptionAttribute[] desc =
                (DescriptionAttribute[])(t.GetField(e.ToString())
                .GetCustomAttributes(typeof(DescriptionAttribute), false));
            return desc.Length > 0 ? desc[0].Description : e.ToString();
        }
        public static byte ToByte(this Enum ai)
        {
            object o=Enum.ToObject(ai.GetType(), ai);
            return Convert.ToByte(o);
        }
    }
    
    
    class Program
    {
        static void Main(string[] args)
        {
            MyEnum me = MyEnum.Third;
    
            Console.WriteLine("Value: {0}\r\nType: {1}"
            ,me.ToByte(),me.ToByte().GetType().ToString());
    
            Console.ReadLine();
        }
    }
    

    它输出:

    值:3

    类型:System.Byte

    【讨论】:

    • 不,我还没有,但这似乎有很多代码只是为了对变量进行类型转换?这是以任何方式达到的表现还是最好的通用方法?我希望有一个“简单的”(字节)替换,关于枚举中的语法什么的?我猜不可能……
    • 我已经添加了示例代码,这只是几行,实际上是 4 行;)
    • 我很困惑...这怎么比铸造容易?它的效率肯定要低得多,因为它引入了一个盒子/拆箱......
    • 为什么要采用这种方法,因为枚举就像为您的属性提供正确的枚举类型一样简单?
    猜你喜欢
    • 2020-03-03
    • 2013-01-13
    • 2015-10-12
    • 2023-02-21
    • 1970-01-01
    • 2017-03-10
    • 1970-01-01
    • 2018-09-30
    相关资源
    最近更新 更多