2009-05-18 4 views
3

Можно ли сделать тип вывода по умолчанию для перечисления?Enum с типом по умолчанию? это возможно?

Я использую перечисление для многих, таких как состояния, и я хочу сравнивать перечисления непосредственно с полями LINQ, но я все время должен автоматически выводить.

ответ

2

Ответ был МНОГО более простым !!!

Мой хороший друг сказал мне, что это очень просто! взгляните на этот образец!

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

Обратите внимание на : BYTE часть после имени Enum ... есть трюк, который я искал! Но спасибо всем, кто пытается за меня!

+0

Спасибо за ваше время, все вы! – BerggreenDK

2

Вы должны иметь свойства в объектах LINQ, имеющих тип перечисления. Таким образом, вам не нужно бросать.

Так что просто измените свойства, чтобы иметь правильный тип перечисления, и вам больше не нужно беспокоиться о приведениях. Вы можете сделать это в дизайнере LINQtoSQL. Просто щелкните объект правой кнопкой мыши, выберите «Свойства» и установите соответствующий тип в окне свойств Visual Studio.

+0

Нет, они часто являются tinyint, так как у меня не более 5-20 различных значений. – BerggreenDK

+0

В этом случае вы должны просто изменить свой тип на тип перечисления, который они на самом деле. LINQtoSQL справится с этим правильно. –

+0

pardon для моего изучаемого вопроса, но где я могу изменить их тип? – BerggreenDK

0

Вы пробовали методы расширения?

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

+0

Нет, у меня еще нет, но это похоже на много кода, чтобы придать тип переменной? это удары производительности в любом случае или является лучшим общим способом сделать трюк? Я надеялся на «простую» (байтовую) замену, что-то о синтаксисе в перечислении или что-то в этом роде? Невозможно, я думаю ... – BerggreenDK

+0

Я добавил пример кода, это всего лишь несколько строк, 4 на самом деле;) – TheVillageIdiot

+0

Я в замешательстве ... как это проще, чем кастинг? Это, безусловно, намного менее эффективно, так как он вводит box/unbox ... –

1

LINQ к SQL, как правило, обрабатывать прямые карты целые и точную строку (имя) карты (примечание : деликатный случай). Значение: напишите свой enum где-нибудь, а в дизайнере задайте тип свойства как полное имя перечисления: Some.Namespace.MyEnum. Это должно работать.

Для нетривиальных отображений (например, где столбец является VARCHAR со значениями в смешанном регистре, или такие вещи, как «In Progress» [обратите внимание на пробел]), вам придется оставить свойство памяти, как int/varchar (и т. д.) и сопоставить его вручную. Я обычно делаю это, пометив его как частное и называя его FooStorage и добавления свойства отображения в частичном классе:

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

Единственная проблема заключается в том, что LINQ запросы будут работать только против хранения собственности (не на заказ).

+0

Моя проблема с orignal заключается в том, что я привык иметь множество перечислений, но когда мне это нравится: oTabel.State = someEnum.SomeState; Я должен написать: oTabel.State = (byte) someEnum.SomeState; Everytime ... can not Я делаю «SomeEnum» в default (BYTE) -cast? – BerggreenDK

+0

Почему бы вам просто не сказать системе о том, чтобы рассматривать состояние как SomeEnum через дизайнера? Но нет: вы не можете добавить оператор неявного преобразования в enum (кроме 0, который всегда имеет неявное преобразование). –

Смежные вопросы