相信XSD枚举是一个更纯粹的执行枚举比在某种意义上说,他们不需要和唐.NET枚举不支持与枚举名称关联的数字值。当然,生成的代码(即.NET代码)将在内部将数值与每个命名值相关联,但这是一个实现细节,并非由XSD标准定义的枚举性质所固有的。在这个纯粹的枚举实现中,我认为将显式数值与每个枚举名称相关联的正确方法是定义一个将枚举值链接到数值的单独集合/类。或者定义表示您支持的组合值(NewInstallOrModify)的其他枚举值。
编辑:
这里是一个什么样的转换器可能看起来像一个样本。
// 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)
你正在编写自己的工具来生成C#代码,还是有一些标准的工具从XSD生成C#代码? – BlueMonkMN
现在我正在使用xsd.exe。我真的没有时间去创建自己的工具。 –