【发布时间】:2009-05-18 09:09:37
【问题描述】:
是否可以为枚举进行默认类型转换?
我经常使用枚举,例如状态,我想将枚举直接与 LINQ 字段进行比较,但我必须一直进行类型转换。
【问题讨论】:
标签: c# asp.net linq linq-to-sql enums
是否可以为枚举进行默认类型转换?
我经常使用枚举,例如状态,我想将枚举直接与 LINQ 字段进行比较,但我必须一直进行类型转换。
【问题讨论】:
标签: c# asp.net linq linq-to-sql enums
您应该能够在具有枚举类型的 LINQ 对象中拥有属性。这样你就不必投射了。
因此,只需更改您的属性以具有正确的枚举类型,您就不必再担心强制转换了。您可以在 LINQtoSQL 设计器中执行此操作。只需右键单击一个属性,选择“属性”并在 Visual Studio 属性窗口中设置适当的类型。
【讨论】:
答案要简单得多!!!
我的一个好朋友告诉我这很简单!看看这个样本!
public enum State:byte
{
EmailNotValidated = 0x00,
EmailValidated = 0x10,
Admin_AcceptPending = 0x40,
Active = 0x80,
Admin_BlockedAccount = 0xff
}
注意枚举名称后面的 :BYTE 部分...这是我正在寻找的技巧!但是感谢所有为我努力的人!
【讨论】:
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 属性(而不是定制属性)。
【讨论】:
你尝试过扩展方法吗?
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
【讨论】: