Я считаю, что перечисления XSD являются более пуристической реализацией перечислений, чем перечисления .NET в том смысле, что они не нужны и не поддерживают числовые значения, связанные с перечисляемыми именами. Конечно, сгенерированный код, являющийся кодом .NET, будет внутренне ассоциировать числовое значение с каждым именованным значением, но это деталь реализации, которая не присуща природе перечисления, как определено стандартом XSD. В этой пуристической реализации перечисления, я полагаю, что правильный способ связать явные числовые значения с каждым перечисляемым именем - это определить отдельную коллекцию / класс, который связывает перечислимые значения с числовыми значениями. Или определите дополнительные перечисляемые значения, которые представляют объединенные значения, которые вы поддерживаете (NewInstallOrModify).
Edit:
Вот пример того, как может выглядеть конвертер.
// 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);
}
}
Редактировать 2:
Если ваше перечисление начинается с 0 (как ваш пример), эти два изменения необходимы для моего примера:
Обновлен конвертер int:
public static implicit operator int(IntMappedEnum<T> value)
{
return (value.originalValue == 0)?0:1 << (value.originalValue - 1);
}
Строка после int log
должна быть:
for (log = 0; value > 0; value >>= 1)