2009-07-23 10 views
1

Dank this Frage gelang es mir herauszufinden, wie ich meine generische Methode beschränken kann, nur Enums zu akzeptieren.Wie erhält man den Datenwert einer Enumeration in einer generischen Methode?

Jetzt versuche ich eine generische Methode zu erstellen, so dass ich eine Dropdown-Liste an eine beliebige Enum binden kann, die Beschreibung in der Dropdown-Liste mit dem Wert numerischen Wert der anzeigen Aufzählungswert.

public static object EnumToDataSource<T>() where T : struct, IConvertible { 
    if (!typeof(T).IsEnum) // just to be safe 
    throw new Exception(string.Format("Type {0} is not an enumeration.", typeof(T))); 
    var q = Enum.GetValues(typeof(T)).Cast<T>() 
    .Select(x => new { ID = DataUtil.ToByte(x), Description = x.ToString() }) // ToByte() is my own method for safely converting a value without throwing exceptions 
    .OrderBy(x => x.Description); 
    return q; 
} 

Sieht gut aus, aber ToByte() gibt immer 0, auch wenn meine Aufzählung hat Werte explizit festgelegt, etwa so:

public enum TStatus : byte { 
    Active = 1, 
    Inactive = 0, 
} 

Außerhalb der generischen Methode, wenn ich einen Wert vom Typ gegossen TStatus zu byte funktioniert es perfekt. Innerhalb der generischen Methode, wenn ich versuche, etwas vom Typ T zu byte zu werfen, erhalte ich einen Compilerfehler. Ich kann auch nichts in der statischen Schnittstelle von Enum finden, um dies zu tun.

Also, wie bekomme ich den numerischen Wert der Enumeration innerhalb der generischen? (Ich werde auch jeden anderen Rat zur Optimierung meines Codes dankbar akzeptieren ...)

Bearbeiten: Ähm, äh ... stellt sich heraus, dass die Sache nicht funktionierte ... weil es einen Fehler gab meine ToByte() Methode ... (erröten). Naja, danke trotzdem - davon habe ich viel gelernt!

+0

Entweder Convert.ToByte() oder Enum.Parse (typeof (T), tVal.ToString()) sollte gut funktionieren. – LBushkin

Antwort

2

Sie können es tun, wie folgt (ändern DataUtil.ToByte (x) zu x.ToByte (null)):

public static object EnumToDataSource<T>() where T : struct, IConvertible 
     { 
      if (!typeof (T).IsEnum) throw new Exception(string.Format("Type {0} is not an enumeration.", typeof (T))); 
      var q = 
       Enum.GetValues(typeof (T)).Cast<T>().Select(x => new {ID = x.ToByte(null), Description = x.ToString()}).OrderBy(
        x => x.Description).ToArray(); 
      return q; 
     } 
+0

Der geheime Schalter! Vielen Dank! :) –

0

Ich verwende die folgende Dienstprogrammfunktion, um einen Enum-Typ in eine bindbare Hash-Tabelle zu konvertieren. Außerdem werden die Kamelfallnamen in räumlich getrennte Wörter umgeschrieben.

public static Hashtable BindToEnum(Type enumType) 
{ 
    // get the names from the enumeration 
    string[] names = Enum.GetNames(enumType); 
    // get the values from the enumeration 
    Array values = Enum.GetValues(enumType); 
    // turn it into a hash table 
    Hashtable ht = new Hashtable(names.Length); 

    for (int i = 0; i < names.Length; i++) 
     // Change Cap Case words to spaced Cap Case words 
     // note the cast to integer here is important 
     // otherwise we'll just get the enum string back again 
     ht.Add(
      (int)values.GetValue(i), 
      System.Text.RegularExpressions.Regex.Replace(names[i], "([A-Z0-9])", " $1", System.Text.RegularExpressions.RegexOptions.Compiled).Trim() 
      ); 
    // return the dictionary to be bound to 
    return ht; 
} 

Sie könnten dies leicht anpassen, indem die Spitze eine generische Funktion sein, was Sie in Ihrer Frage stellen und die Definition der Funktion zu ändern.

0

Vielleicht können Sie etwas tun, mit meinem EnumExtensions

foreach auf einem Enum und erstellen Sie eine Datenquelle.

3

Ich denke, die einfachste Sache zu tun, anstatt einer Besetzung der Convert-Klasse verwenden:

T someValueThatIsAnEnum; 
byte enumValue = Convert.ToByte((object)someValueThatIsAnEnum); 

Alternativ können Sie sich darauf verlassen können, dass Aufzählungen sich auf eine String-Darstellung umwandeln kann, und analysieren sich zurück auch:

T someValueThatIsAnEnum; 
string enumAsString = someValueThatIsAnEnum.ToString(); 
byte enunValue = (byte)Enum.Parse(typeof(T), enumAsString); 
Verwandte Themen