Creo enumeraciones XSD son una aplicación más purista de enumeraciones que las enumeraciones de .NET en el sentido de que no es necesario y don No admite valores numéricos asociados con los nombres enumerados. Por supuesto, el código generado, que es un código .NET, asociará un valor numérico con cada valor nombrado internamente, pero este es un detalle de implementación que no es inherente a la naturaleza de una enumeración según lo define el estándar XSD. En esta implementación purista de una enumeración, creo que la forma correcta de asociar valores numéricos explícitos con cada nombre enumerado sería definir una colección/clase separada que vincule valores enumerados con valores numéricos. O define valores enumerados adicionales que representan los valores combinados que admite (NewInstallOrModify).
Editar:
He aquí una muestra de lo que un convertidor podría ser similar.
// Generated code
public enum SetupTypeEnum
{
None,
NewInstall,
Modify,
Upgrade,
Uninstall
}
// End generated code
public struct IntMappedEnum<T> where T : struct
{
public readonly int originalValue;
public IntMappedEnum(T value)
{
originalValue = (int)Enum.ToObject(typeof(T), value);
}
public IntMappedEnum(int originalValue)
{
this.originalValue = originalValue;
}
public static implicit operator int(IntMappedEnum<T> value)
{
return 1 << value.originalValue;
}
public static implicit operator IntMappedEnum<T>(T value)
{
return new IntMappedEnum<T>(value);
}
public static implicit operator IntMappedEnum<T>(int value)
{
int log;
for (log = 0; value > 1; value >>= 1)
log++;
return new IntMappedEnum<T>(log);
}
public static explicit operator T(IntMappedEnum<T> value)
{
T result;
Enum.TryParse<T>(value.originalValue.ToString(), out result);
return result;
}
}
class Program
{
static void Main(string[] args)
{
SetupTypeEnum s = SetupTypeEnum.Uninstall;
IntMappedEnum<SetupTypeEnum> c = s;
int n = c;
IntMappedEnum<SetupTypeEnum> c1 = n;
SetupTypeEnum s1 = (SetupTypeEnum)c1;
Console.WriteLine("{0} => {1} => {2}", s, n, s1);
}
}
Edición 2:
Si su enumeración comienza en 0 (como su ejemplo hace) estos dos cambios son necesarios para mi ejemplo:
Actualizado convertidor int:
public static implicit operator int(IntMappedEnum<T> value)
{
return (value.originalValue == 0)?0:1 << (value.originalValue - 1);
}
La línea después de int log
debe ser:
for (log = 0; value > 0; value >>= 1)
¿Está escribiendo su propia herramienta para generar el código C#, o hay alguna herramienta estándar que generó el código C# de XSD? – BlueMonkMN
Ahora estoy usando xsd.exe. Realmente no tengo tiempo para crear mi propia herramienta. –