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.ByteLINQ 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行;)我很困惑。。。这怎么比铸造容易呢?它的效率当然要低得多,因为它引入了一个长方体/取消长方体…对于枚举来说,简单到为属性提供正确的枚举类型,为什么要采用这种方法?谢谢大家!