2009-05-18 12 views

Répondre

2

La réponse était BEAUCOUP plus simple !!!

Un bon ami à moi m'a dit que c'est très simple! Jetez un oeil à cet échantillon!

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

attention à la : BYTE partie après le nom de l'Enum ... il y a le truc que je cherchais! Mais merci à tout le monde qui essaie pour moi!

+0

Merci pour votre temps, vous tous! – BerggreenDK

2

Vous devriez pouvoir avoir des propriétés dans vos objets LINQ qui ont un type enum. De cette façon, vous n'avez pas à lancer.

Alors changez simplement vos propriétés pour avoir le bon type enum et vous n'avez plus à vous soucier des moulages. Vous pouvez le faire dans le concepteur LINQtoSQL. Cliquez avec le bouton droit sur une propriété, sélectionnez "Propriétés" et définissez le type approprié dans la fenêtre Propriétés de Visual Studio.

+0

Non, ils sont souvent tinyint car je n'ai pas plus de 5 à 20 valeurs différentes. – BerggreenDK

+0

Dans ce cas, vous devriez juste changer leur type en le type enum ils sont réellement. LINQtoSQL gérera cela correctement. –

+0

pardon pour ma question studpid, mais où puis-je changer leur type? – BerggreenDK

0

Avez-vous essayé des méthodes d'extension?

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(); 
    } 
} 

Il produit:

Valeur: 3

Type: System.Byte

+0

Non, je ne l'ai pas encore, mais cela semble être beaucoup de code juste pour classer une variable? Est-ce que cette performance de frappe est de toute façon ou est la meilleure façon générale de faire le tour? J'espérais un remplacement «simple» (octet), quelque chose à propos de la syntaxe dans l'énumération ou autre chose? Pas possible je suppose ... – BerggreenDK

+0

J'ai ajouté l'exemple de code c'est juste quelques lignes, 4 en fait;) – TheVillageIdiot

+0

Je suis confus ... comment est-ce plus facile que le casting? C'est certainement beaucoup moins efficace, puisqu'il introduit une boîte/unbox ... –

1

cartes LINQ to SQL généralement gérer entiers directs et cartes chaîne (nom) exact (note : sensible aux majuscules et minuscules). Signification: écrivez votre énumération quelque part, et dans le concepteur définissez le type de propriété en tant que nom d'énumération complet: Some.Namespace.MyEnum. Cela devrait normalement fonctionner.

Pour applications non triviales (par exemple, où la colonne est un varchar avec des valeurs mixtes cas, ou des choses comme « In Progress » [notez l'espace]), vous devrez quitter la propriété de stockage int/varchar (etc) et le mapper manuellement. Je fais habituellement cela en marquant comme privé et en le nommant FooStorage, et en ajoutant une propriété de mappage dans une classe partielle:

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

Le seul problème est que les requêtes LINQ ne fonctionnera contre le stockage propriété (pas propriété sur mesure).

+0

Mon problème original est que je suis habitué à avoir des charges d'énumérations, mais quand je fais comme ceci: oTabel.State = someEnum.SomeState; Je dois l'écrire: oTabel.State = (byte) someEnum.SomeState; À chaque fois ... je ne peux pas mettre le "SomeEnum" en défaut (BYTE) -cast? – BerggreenDK

+0

Pourquoi ne pas simplement dire au système de traiter State comme SomeEnum via le concepteur? Mais non: vous ne pouvez pas ajouter un opérateur de conversion implicite à une énumération (sauf pour 0, qui a toujours une conversion implicite). –

Questions connexes