2012-03-30 5 views
2

Arbeiten an einem Projekt, wo sie viele Enums und viele duplizierte Objekte über mehrere DLLs haben. Ein Durcheinander, aber weitermachen.Enum in Enum konvertieren funktioniert nicht wenn nicht in der gleichen Reihenfolge

Ich habe diese Erweiterung Methode, die funktioniert, wenn eine Enum zu Enum Umwandlung, die die gleiche Position in der Enum hat aber es schlägt fehl, wenn der Name das gleiche ist, aber die Position der Enumeration ist anders

Wie kann verbessern mein Code, so dass es wird die richtige Enumeration auf Namensübereinstimmung basierend unabhängig davon, wo in der enum

Dank

[TestClass] 
    public class UnitTest1 
    { 
     [TestMethod] 
     public void ToEnum_convert_returnsCorrectEnum() 
     { 
      const CategoryA categoryALawyer = CategoryA.Lawyer; 
      var result = categoryALawyer.ToEnum<CategoryB>(); 

      Assert.AreEqual(CategoryA.Lawyer.ToString(),result.ToString()); 
     } 
    } 


    namespace Utilities 
    { 
     public enum CategoryA 
     { 
      Lawyer, 
      Developer, 
      Manager, 
      Employee, 
      Director, 

     } 

     public enum CategoryB 
     { 
      Director, 
      Manager, 
      Developer, 
      Employee, 
      Lawyer 
     } 

     public static class EnumExtensions 
     { 
      public static T ToEnum<T>(this Enum value) 
      { 
       return (T)Enum.ToObject(typeof(T), value); 
      }    
     } 
    } 

EDIT

befindet

Einige dlls habe ich keine Kontrolle über, so kann ich nicht Enum Ordnung

+4

Wenn Sie die Namen anders bestellen, die Namen auf verschiedene Werte entsprechen wird, wenn Sie sie manuell zuweisen. Dies ist im Grunde, wie Enums arbeiten, und ist von Entwurf. – BoltClock

+1

Dieses Verhalten ist nicht so überraschend, wenn Sie darüber nachdenken. Denken Sie daran, dass Sie Enum-Wert explizit in Ints und zurück konvertieren können. – McGarnagle

+0

Ich wusste nicht, dass dies 'Director' kompiliert '(in' CategoryA'). –

Antwort

7
T val; 
if (Enum.TryParse<T>(value.ToString(), out val)) 
    return val; 
else return default(T); 

bearbeiten ändern: Changed "Parse" auf die richtige "TryParse". Auch hat die TryParse Methode, um eine Überlastung zu machen, Groß- und Kleinschreibung, wenn Sie wollen:

Enum.TryParse<T>(value.ToString(), true, out val) 
+0

Danke das hat funktioniert – user9969