2009-05-18 12 views

Antwort

2

Die Antwort war VIEL einfacher !!!

Ein guter Freund von mir sagte mir, das ist sehr einfach! Schauen Sie sich dieses Beispiel an!

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

Achten Sie auf die : BYTE Teil nach dem Namen des Enum ... es ist der Trick, die ich suchte! Aber danke an alle, die es für mich versuchen!

+0

Danke für Ihre Zeit, Sie alle! – BerggreenDK

2

Sie sollten Eigenschaften in Ihren LINQ-Objekten mit einem Enum-Typ haben können. Auf diese Weise musst du nicht casten.

Also ändern Sie einfach Ihre Eigenschaften, um den richtigen Enum-Typ zu haben, und Sie müssen sich nicht mehr um Umwandlungen kümmern. Sie können dies im LINQtoSQL-Designer tun. Klicken Sie mit der rechten Maustaste auf eine Eigenschaft, wählen Sie "Eigenschaften" und setzen Sie den entsprechenden Typ im Fenster "Eigenschaften von Visual Studio".

+0

Nein, sie sind oft tinyint, wie ich zu 20 verschiedene Werte nicht mehr als 5 haben. – BerggreenDK

+0

In diesem Fall sollten Sie nur ihren Typ auf den Enum-Typ ändern, der sie tatsächlich sind. LINQtoSQL wird das korrekt behandeln. –

+0

Verzeihung für meine studpid Frage, aber wo ändere ich ihren Typ? – BerggreenDK

0

Haben Sie Erweiterungsmethoden ausprobiert?

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

Es gibt:

Wert: 3

Typ: System.Byte

+0

Nein, habe ich noch nicht, aber das scheint eine Menge Code zu sein, nur um eine Variable zu tippen? Ist das eine Leistung oder ist es die beste Art und Weise dies zu tun? Ich hatte gehofft, für einen „einfachen“ (Byte) Ersatz, etwas über Syntax in der Enum oder so etwas? Nicht möglich Ich denke, ... – BerggreenDK

+0

Ich habe den Beispielcode dieses hinzugefügt ist nur wenige Zeilen, 4 tatsächlich;) – TheVillageIdiot

+0

Ich bin verwirrt ... wie ist das einfacher als Gießen? Es ist sicherlich viel weniger effizient, da es eine Box/Unbox einführt ... –

1

LINQ-to-SQL in der Regel direkt integer Karten und genaue Zeichenfolge (name) Karten (Anmerkung behandelt : Groß-/Kleinschreibung beachten). Bedeutung: Schreiben Sie Ihre Enum irgendwo, und in dem Designer stellen Sie den Objekttyp als vollqualifizierten Enum Name: Some.Namespace.MyEnum. Es sollte normalerweise funktionieren.

Für nicht-triviale Abbildungen (zum Beispiel, wenn die Spalte ein varchar mit Groß- und Kleinwerten oder Dinge wie „In Progress“ [den Raum beachten]), werden Sie die Speichereigenschaft als int/varchar verlassen müssen (etc) und ordnen Sie es manuell zu. Ich tue dies in der Regel, indem sie es als privat kennzeichnen und es FooStorage, und das Hinzufügen einer Mapping-Eigenschaft in einer Teilklasse Benennung:

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

Das einzige Problem ist, dass LINQ-Abfragen werden nur gegen die Speicher Eigenschaft arbeiten (nicht die maßgeschneidertes Eigentum).

+0

Mein orignal Problem ist, dass ich gewohnt bin, eine Menge enums zu haben, aber wenn ich das mag: oTabel.State = someEnum.SomeState; Ich muss es schreiben: oTabel.State = (Byte) someEnum.SomeState; Immer ... kann ich nicht "SomeEnum" in Standard (BYTE) -cast? – BerggreenDK

+0

Warum sollten Sie dem System nicht einfach mitteilen, dass es State als SomeEnum über den Designer behandeln soll? Aber nein: Sie können keinen impliziten Konvertierungsoperator zu einer Enumeration hinzufügen (außer 0, die immer eine implizite Konvertierung hat). –