Enum с типом по умолчанию? это возможно? - PullRequest
3 голосов
/ 18 мая 2009

возможно ли сделать тип-трансляцию по умолчанию для перечисления?

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

Ответы [ 4 ]

2 голосов
/ 19 мая 2009

Ответ был НАМНОГО проще !!!

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

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

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

2 голосов
/ 18 мая 2009

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

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

1 голос
/ 18 мая 2009

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 будут работать только со свойством storage (а не со свойством).

0 голосов
/ 18 мая 2009

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...