C# 使用默认类型转换的枚举?可能吗?

C# 使用默认类型转换的枚举?可能吗?,c#,asp.net,linq,linq-to-sql,enums,C#,Asp.net,Linq,Linq To Sql,Enums,是否可以为枚举创建默认类型转换 我经常使用enum,比如states,我想直接将enum与LINQ字段进行比较,但我必须一直进行类型转换。您应该能够在LINQ对象中具有enum类型的属性。这样你就不必投了 因此,只需更改属性以获得正确的枚举类型,就不必再担心强制转换。可以在LINQtoSQL设计器中执行此操作。只需右键单击属性,选择“属性”,并在Visual Studio属性窗口中设置适当的类型。您尝试过扩展方法吗 public enum MyEnum { First = 1,

是否可以为枚举创建默认类型转换


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

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


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

您尝试过扩展方法吗

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

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

对于非平凡映射(例如,列是大小写值混合的varchar,或者类似“进行中”[请注意空格]),必须将存储属性保留为
int
/
varchar
(等)并手动映射。为此,我通常将其标记为private,并将其命名为
FooStorage
,并在分部类中添加映射属性:

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

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

答案要简单得多

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

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


请注意枚举名称后的:BYTE部分。。。这就是我一直在寻找的诀窍!但感谢所有为我努力的人

不,它们通常很小,因为我没有超过5到20个不同的值。在这种情况下,您应该将它们的类型更改为实际的枚举类型。LINQtoSQL将正确处理此问题。请原谅我的studpid问题,但是我在哪里更改它们的类型?我在回答中添加了一些更多信息。我的原始问题是我习惯于有大量枚举,但当我这样做时:oTabel.State=someEnum.SomeState;我必须编写它:oTabel.State=(byte)someEnum.SomeState;每次。。。我不能将“SomeEnum”转换为默认(字节)强制转换吗?为什么不告诉系统通过设计器将状态视为SomeEnum?但否:您不能将隐式转换运算符添加到枚举(0除外,它始终具有隐式转换)。不,我还没有,但这似乎需要很多代码才能对变量进行类型转换?这是在任何方面的打击性能或是最好的一般方式做的把戏?我希望有一个“简单”(字节)的替换,关于枚举中的语法还是什么?我猜不可能……我已经添加了示例代码,这只是几行,实际上是4行;)我很困惑。。。这怎么比铸造容易呢?它的效率当然要低得多,因为它引入了一个长方体/取消长方体…对于枚举来说,简单到为属性提供正确的枚举类型,为什么要采用这种方法?谢谢大家!