2009-12-18 12 views
14

¿Puedo declarar C# enum como bool como:¿puede declararse C# enums como de tipo bool?

enum Result : bool 
{ 
    pass = true, 
    fail = false 
} 
+18

sólo si se agrega un tercer valor, FileNotFound – blu

+0

Incluso si fuera posible, no veo esto como siendo cualquier cosa menos confuso . 'if (! IsFailed) {...}' sería completamente ilegible. –

+1

¿Cuál es el beneficio de decir 'bool success = Result.Pass' en lugar de' bool success = true'? ¿Es esto una cosa de legibilidad? –

Respuesta

17

si necesita su enumeración para contener los datos booleanos, además de valor de tipo de la constante de enumeración, se puede añadir un atributo simple a su enumeración, teniendo un valor booleano. Luego puede agregar un método de extensión para su enumeración que recupera el atributo y devuelve su valor booleano.

public class MyBoolAttribute: Attribute 
{ 
     public MyBoolAttribute(bool val) 
     { 
      Passed = val; 
     } 

     public bool Passed 
     { 
      get; 
      set; 
     } 
} 

public enum MyEnum 
{ 
     [MyBoolAttribute(true)] 
     Passed, 
     [MyBoolAttribute(false)] 
     Failed, 
     [MyBoolAttribute(true)] 
     PassedUnderCertainCondition, 

     ... and other enum values 

} 

/* the extension method */  
public static bool DidPass(this Enum en) 
{ 
     MyBoolAttribute attrib = GetAttribute<MyBoolAttribute>(en); 
     return attrib.Passed; 
} 

/* general helper method to get attributes of enums */ 
public static T GetAttribute<T>(Enum en) where T : Attribute 
{ 
     Type type = en.GetType(); 
     MemberInfo[] memInfo = type.GetMember(en.ToString()); 
     if (memInfo != null && memInfo.Length > 0) 
     { 
      object[] attrs = memInfo[0].GetCustomAttributes(typeof(T), 
      false); 

      if (attrs != null && attrs.Length > 0) 
       return ((T)attrs[0]); 

     } 
     return null; 
} 
20

Dice

Los tipos aprobados para una enumeración son bytes, sbyte, corta, ushort, int, uint largo, o ULONG .

enum (C# Reference)

6

¿Qué hay de:

class Result 
    { 
     private Result() 
     { 
     } 
     public static Result OK = new Result(); 
     public static Result Error = new Result(); 
     public static implicit operator bool(Result result) 
     { 
      return result == OK; 
     } 
     public static implicit operator Result(bool b) 
     { 
      return b ? OK : Error; 
     } 
    } 

Usted puede usarlo como Enum o como bool, por ejemplo var x = Result.OK; Resultado y = verdadero; si (x) ... o si (y == Result.OK)