unity switch example enum define c# enums enum-flags

switch - enum in model c#



Cómo configurar todos los bits de enum flag (4)

En caso de que alguien se esté preguntando: necesitaba hacer el mismo edificio con un convertidor enuminable enlazable para WPF.
Como no sé qué significan los valores en Reflexión, necesitaba poder cambiar valores manualmente (vinculándolos a una casilla de verificación pe)
Hay un problema al establecer el valor de una enumeración marcada en -1 para establecer todos los bits.
Si lo configura en -1 y desmarca todos los valores, no dará como resultado 0 porque todos los bits no utilizados no están descolgados.
Esto es lo que mejor funcionó para mi situación.

SomeRightEnum someRightEnum = SomeRightEnum.CanDoNothing; Type enumType = someRightEnum.GetType(); int newValue = 0; var enumValues = Enum.GetValues(enumType).Cast<int>().Where(e => e == 1 || e % 2 == 0); foreach (var value in enumValues) { newValue |= value; } Console.WriteLine(newValue);

O si quieres un método de extensión:

public static class FlagExtensions { public static TEnum AllFlags<TEnum>(this TEnum @enum) where TEnum : struct { Type enumType = typeof(TEnum); long newValue = 0; var enumValues = Enum.GetValues(enumType); foreach (var value in enumValues) { long v = (long)Convert.ChangeType(value, TypeCode.Int64); if(v == 1 || v % 2 == 0) { newValue |= v; } } return (TEnum)Enum.ToObject(enumType , newValue); } }

Me pregunto una forma genérica para establecer todos los bits de la bandera de enum en 1. Me gustaría tener una enum que devuelva para todas las comparaciones, independientemente de otras enumeraciones.

Y este código funciona;

[Flags] public enum SomeRightEnum : uint { CanDoNothing = 0, CanDoSomething = 1 << 0, CanDoSomethingElse = 1 << 1, CanDoYetAnotherThing = 1 << 2, ... DoEverything = 0xFFFFFFFF }

Pero en el código anterior, ya que no se establece el número de "F", no funcionaría si fuera int .

Así que apreciaré una forma genérica de establecer todos los bits de enum flag en 1, sin importar el tipo de datos ( int64 , int64 , uint , etc.)


Lo más fácil es probablemente:

enum Foo { blah = 1, .... all = ~0 }

Para enumeración basada sin firmar:

enum Foo : uint { blah = 1, .... all = ~0u; }


[Flags] public enum MyEnum { None = 0, First = 1 << 0, Second = 1 << 1, Third = 1 << 2, Fourth = 1 << 3, All = ~(-1 << 4) }


internal static class Program { private static void Main() { Console.WriteLine(Foo.Everything.HasFlag(Foo.None)); // False Console.WriteLine(Foo.Everything.HasFlag(Foo.Baz)); // True Console.WriteLine(Foo.Everything.HasFlag(Foo.Hello)); // True } } [Flags] public enum Foo : uint { None = 1 << 0, Bar = 1 << 1, Baz = 1 << 2, Qux = 1 << 3, Hello = 1 << 4, World = 1 << 5, Everything = Bar | Baz | Qux | Hello | World }

¿Era esto lo que querías?