¿Puedo declarar C# enum
como bool
como:¿puede declararse C# enums como de tipo bool?
enum Result : bool
{
pass = true,
fail = false
}
¿Puedo declarar C# enum
como bool
como:¿puede declararse C# enums como de tipo bool?
enum Result : bool
{
pass = true,
fail = false
}
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;
}
Dice
Los tipos aprobados para una enumeración son bytes, sbyte, corta, ushort, int, uint largo, o ULONG .
¿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)
sólo si se agrega un tercer valor, FileNotFound – blu
Incluso si fuera posible, no veo esto como siendo cualquier cosa menos confuso . 'if (! IsFailed) {...}' sería completamente ilegible. –
¿Cuál es el beneficio de decir 'bool success = Result.Pass' en lugar de' bool success = true'? ¿Es esto una cosa de legibilidad? –