Hola a todos, tengo una pregunta rápida que me parece que no puede encontrar nada sobre ...banderas grandes enumeraciones en C#
Estoy trabajando en un proyecto que requiere enumeraciones, marca con un gran número de banderas (hasta el 40-ish), y no me siento muy similar a hacerlo en la máscara exacta para cada valor de la enumeración:
public enum MyEnumeration : ulong
{
Flag1 = 1,
Flag2 = 2,
Flag3 = 4,
Flag4 = 8,
Flag5 = 16,
// ...
Flag16 = 65536,
Flag17 = 65536 * 2,
Flag18 = 65536 * 4,
Flag19 = 65536 * 8,
// ...
Flag32 = 65536 * 65536,
Flag33 = 65536 * 65536 * 2
// right about here I start to get really pissed off
}
por otra parte, también estoy esperando que hay una (IER) forma fácil para mí para controlar la disposición real de los bits en diferentes máquinas Endian, ya que estos valores se serializarán eventualmente a través de una red:
public enum MyEnumeration : uint
{
Flag1 = 1, // BIG: 0x00000001, LITTLE:0x01000000
Flag2 = 2, // BIG: 0x00000002, LITTLE:0x02000000
Flag3 = 4, // BIG: 0x00000004, LITTLE:0x03000000
// ...
Flag9 = 256, // BIG: 0x00000010, LITTLE:0x10000000
Flag10 = 512, // BIG: 0x00000011, LITTLE:0x11000000
Flag11 = 1024 // BIG: 0x00000012, LITTLE:0x12000000
}
Por lo tanto, estoy un poco pregunto si hay alguna manera fresca puedo configurar mis enumeraciones arriba como:
public enum MyEnumeration : uint
{
Flag1 = flag(1), // BOTH: 0x80000000
Flag2 = flag(2), // BOTH: 0x40000000
Flag3 = flag(3), // BOTH: 0x20000000
// ...
Flag9 = flag(9), // BOTH: 0x00800000
}
lo que he intentado:
// this won't work because Math.Pow returns double
// and because C# requires constants for enum values
public enum MyEnumeration : uint
{
Flag1 = Math.Pow(2, 0),
Flag2 = Math.Pow(2, 1)
}
// this won't work because C# requires constants for enum values
public enum MyEnumeration : uint
{
Flag1 = Masks.MyCustomerBitmaskGeneratingFunction(0)
}
// this is my best solution so far, but is definitely
// quite clunkie
public struct EnumWrapper<TEnum> where TEnum
{
private BitVector32 vector;
public bool this[TEnum index]
{
// returns whether the index-th bit is set in vector
}
// all sorts of overriding using TEnum as args
}
Justo preguntándose si alguien tiene ideas geniales, ¡gracias!
que ha escrito unos pocos cientos de líneas de texto aquí. ¿Por qué no acabas de morder la bala y tecleas las 40 líneas originales? (Es posible que haya utilizado 1 << 1, 1 << 2, ... en lugar de las multiplicaciones, pero de todos modos ...) –
Umm ... Yo quería presentar las soluciones que había intentado, "<<" and ">>" habría funcionó, pero no veo exactamente la diferencia cuando solo se evalúan una vez. No es como que me tome media hora escribir esto, unos pocos cientos de líneas de texto no son muchas ...Prefiero proporcionar demasiada información que muy poco ... – LorenVS
puede usar todo el rango del ulong con el operador de desplazamiento, solo tendrá que indicar al compilador que el 1 que está cambiando es un ulong. 1ul << 63, fíjate en el 'ul' después del 1. –